GUI with Forward and Back buttons on PyQt5

0

I noticed a very frequent doubt about how to do a GUI with Forward and Back buttons, being in PyQt4, had a question made a long time ago and that had not been answered until then. I once had made one in PyQt5, so do not get me wrong by the fact that I ask a question and I even respond. My intention is to make my material available, and maybe it can be useful to someone.

    
asked by anonymous 03.04.2017 / 11:45

1 answer

0

Well, I did this: I put what I want to be displayed to each screen in a container (QGroupBox) and I hid it. Then just give the command nome_do_container .hide () so that the current content disappears and nome_do_container .show () to display the next content.

In the example, the display is linear, so I put the containers in an array. If it is not linear, it is better to use a dictionary.

In the PushButtons, I added a property that I called step_value, the value of which is -1 for the "Return" button and 1 for "Next". So I use the same slot for both, controlling the view, where, simply adding the value of the step_value property of the calling object of the function to the Index of the display array. The code is the one below.

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5.Qt import *

class App(QDialog):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Exemplo de Avançar e Retroceder")
        self.setGeometry(100, 100, 500, 300)

        windowLayout = QGridLayout()
        self.setLayout(windowLayout)

        self.Lista_de_exibicao = []

        """
        self.Lista_de_exibicao: Terá os Widgets que serão ora mostrados, ora ocultados
        Atenção: caso seja mais conveniente, em vez de array, pode ser usado um dicionário.
        """
        self.PosAtual = 0              # Index do Item que está sendo mostrado


        nome = self.criaNome()
        windowLayout.addWidget(nome, 0, 0, 1, 2, Qt.AlignTop)
        self.Lista_de_exibicao.append(nome)

        parceiro = self.criaPrarceiro()
        windowLayout.addWidget(parceiro, 1, 0, 1, 2, Qt.AlignTop)
        self.Lista_de_exibicao.append(parceiro)

        lazer = self.criaLazer()
        windowLayout.addWidget(lazer, 2, 0, 1, 2, Qt.AlignTop)
        self.Lista_de_exibicao.append(lazer)

        transporte = self.criaTransporte()
        windowLayout.addWidget(transporte, 3, 0, 1, 2, Qt.AlignTop)
        self.Lista_de_exibicao.append(transporte)

        veiculo = self.criaVeiculo()
        windowLayout.addWidget(veiculo, 4, 0, 1, 2)
        self.Lista_de_exibicao.append(veiculo)


        respostas = self.criaRespostas()
        windowLayout.addWidget(respostas, 5, 0, 1, 2)
        self.Lista_de_exibicao.append(respostas)

        self.btn_anterior = QPushButton(" < Anterior ")
        self.btn_anterior.step_value = -1  # O step_value = -1 leva ao índice anterior
        self.btn_anterior.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.btn_anterior.hide()
        self.btn_anterior.clicked.connect(self.buttonClick)  # Os DOIS BOTÕES usam o mesmo slot!

        self.btn_proximo = QPushButton("  Próxima  > ")
        self.btn_proximo.step_value = 1  # O step_value = 1  leva ao próximo índice
        self.btn_proximo.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.btn_proximo.clicked.connect(self.buttonClick)  # Os DOIS BOTÕES usam o mesmo slot!

        self.btn_sair = QPushButton("Sair")
        self.btn_sair.hide()
        self.btn_sair.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.btn_sair.clicked.connect(QCoreApplication.instance().quit)

        FrameBtns = QFrame()
        layout_frame_btns = QHBoxLayout()
        FrameBtns.setLayout(layout_frame_btns)
        layout_frame_btns.addWidget(self.btn_anterior)
        layout_frame_btns.addWidget(self.btn_proximo)
        layout_frame_btns.addWidget(self.btn_sair)

        windowLayout.addWidget(FrameBtns, 6, 1, 1, 1, Qt.AlignBottom)

        self.show()

    def criaNome(self):
        GNome = QGroupBox("Nome")
        layout = QVBoxLayout()
        layout.addWidget(QLabel("Qual seu nome?"))
        self.nome = QLineEdit()       # sempre colocando no self aqueles que precisará chamar no futuro
        layout.addWidget(self.nome)
        GNome.setLayout(layout)
        return GNome

    def criaPrarceiro(self):
        self.GParceiro = QGroupBox("Parceiro(a) ideal para você")
        layout = QVBoxLayout()
        layout.addWidget(QRadioButton("Loiro(a)"))
        layout.addWidget(QRadioButton("Moreno(a)"))
        layout.addWidget(QRadioButton("Ruivo(a)"))
        layout.addWidget(QRadioButton("Mulato(a)"))
        layout.addWidget(QRadioButton("Negro(a)"))
        layout.addWidget(QRadioButton("Indígena"))
        layout.addWidget(QRadioButton("Isso não é relevante"))
        self.GParceiro.setLayout(layout)
        self.GParceiro.hide()
        return self.GParceiro

    def criaLazer(self):
        self.GLazer = QGroupBox("Lazer")
        layout = QVBoxLayout()
        layout.addWidget(QLabel("O que você gosta de fazer?"))
        layout.addWidget(QCheckBox("Esportes coletivos(futebol, vôlei, basquete, ...)"))
        layout.addWidget(QCheckBox("Esportes individuais(tênis, boliche, badminton,...)"))
        layout.addWidget(QCheckBox("Esportes radicais(paraquedismo, automobilismo, motocross,...)"))
        layout.addWidget(QCheckBox("Artes marciais(judô, taekwondo, jiu-jitsu,...)"))
        layout.addWidget(QCheckBox("Escotismo, acampamento, pescaria, ..."))
        layout.addWidget(QCheckBox("Hobby(fazer móveis, artesanato, desenho, pintura,...)"))
        layout.addWidget(QCheckBox("Atividades gamer, e-sports,...)"))
        self.GLazer.setLayout(layout)
        self.GLazer.hide()
        return self.GLazer

    def criaTransporte(self):
        self.GTransporte = QGroupBox("Qual seu meio de transporte preferido?")
        layout = QVBoxLayout()
        layout.addWidget(QRadioButton("Avião"))
        layout.addWidget(QRadioButton("Carro"))
        layout.addWidget(QRadioButton("Moto"))
        layout.addWidget(QRadioButton("Barco"))
        layout.addWidget(QRadioButton("Bicicleta"))
        self.GTransporte.setLayout(layout)
        self.GTransporte.hide()
        return self.GTransporte

    def criaVeiculo(self):
        GVeiculo = QGroupBox("Descreva como você considera que seria seu veículo ideal")
        layout = QVBoxLayout()
        self.about_veic = QPlainTextEdit()
        layout.addWidget(self.about_veic)
        GVeiculo.setLayout(layout)
        GVeiculo.hide()
        return GVeiculo

    def criaRespostas(self):
        GResposta = QGroupBox("Obtenção dos dados")
        layout = QVBoxLayout()
        self.browser = QTextBrowser()
        layout.addWidget(self.browser)
        GResposta.setLayout(layout)
        GResposta.hide()
        return GResposta

    # O dois botão usam o mesmo slot buttonClic e avançando ou retornando,
    # dependo do valor do self.sender().step_value ==> 1: "Próximo", -1:"Anterior"
    def buttonClick(self):
        MaxIndex = len(self.Lista_de_exibicao) - 1

        self.Lista_de_exibicao[self.PosAtual].hide()

        if self.PosAtual == MaxIndex:
            self.btn_sair.hide()
            self.btn_proximo.show()

        self.PosAtual += self.sender().step_value     # Atualiza o indice
        self.Lista_de_exibicao[self.PosAtual].show()  # Mostra o próximo grupo items (anterior ou posterior!)

        if self.PosAtual == MaxIndex - 1:
            self.btn_proximo.setText("Finalizar")
        elif self.PosAtual == MaxIndex - 2:
            self.btn_proximo.setText("Avançar > ")
        elif self.PosAtual == MaxIndex:
            self.btn_proximo.hide()
            self.btn_sair.show()

            # Busca dos dados
            self.browser.clear()
            html = "<big><b>Suas respostas Foram</b></big><br>"

            texto = self.nome.text()
            if len(texto) > 0:
                html += "Nome: <big><i><font color = blue>"
                html +=  texto + "</font></i></big><br>"
            else:
                html += "Você não respondeu qual é o seu nome!<br>"

            ParCh = self.GParceiro.children()
            parc = ""
            for ch in ParCh:
                if isinstance(ch, QRadioButton):
                    if ch.isChecked():
                        parc = ch.text()
            if len(parc) > 0:
                html += "Parceiro(a) ideal: <big><i><font color = blue>"
                html += parc + "</font></i></big><br>"
            else:
                html += "Você não disse qual o seu tipo preferido de parceiro!<br>"

            LazerCh = self.GLazer.children()
            lazer = ""
            for lz in LazerCh:
                if isinstance(lz, QCheckBox):
                    if lz.isChecked():
                        lazer += lz.text() + "<br>"
            if len(lazer) > 0:
                html += "Sobre Lazer, você disse que gosta de: <br><big><i><font color = blue>"
                html += lazer + "<br></font></i></big>"
            else:
                html += "Não foi marcada nenhuma opção de lazer.<br>"

            TransCh = self.GTransporte.children()
            transp = ""
            for tr in TransCh:
                if isinstance(tr, QRadioButton):
                    if tr.isChecked():
                        transp += tr.text() + "<br>"
            if len(transp) > 0:
                html += "Transporte preferido : <big><i><font color = blue>"
                html += transp + "</font></i></big><br>"
            else:
                html += "Não foi marcada a opção de transporte preferido.<br>"

            abveic = self.about_veic.toPlainText()
            if len(abveic) > 0:
                html += "Considerações sobre su veículo ideal: <big><i><font color = blue>"
                html +=  abveic + "</font></i></big><br>"
            else:
                html += "Não foi feita nenhuma consideração a respeito de como seria o seu veículo ideal."

            self.browser.setHtml(html)

        elif self.PosAtual == 0:
            self.btn_anterior.hide()
        elif self.PosAtual == 1:
            self.btn_anterior.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
    
03.04.2017 / 11:56