How to create buttons next and back QUI Pyqt4

Asked

Viewed 938 times

5

Hello, I’m new to Pyqt and I have a question, I need to create a program with several steps, or screens, where the user will do his due processing on each screen and clicking 'forward' to the next screen, or if he wants to edit something earlier, he would click 'back', but I don’t know how to implement it using Pyqt. An example of what I mean would be a screen with buttons:

# coding: utf8
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Frm(QWidget):
    def __init__(self, parent = None):
        super(Frm, self).__init__(parent)

        avancar = QPushButton(u'Avançar >', self)
        #voltar = QPushButton(u'< Voltar', self)

        hbox = QHBoxLayout()

        #hbox.addWidget(voltar)
        hbox.addWidget(avancar)

        self.setLayout(hbox)

if __name__ == '__main__':
    import sys
    root = QApplication(sys.argv)
    app = Frm(None)
    app.show()
    root.exec_()

Where from the second screen, there would be the back button to return to the previous screen, I hope to have been clear in questioning.

1 answer

1

Dude, I would have done something like this. Only in Pyqt5. In Pyqt5 they made some changes, passed the Widgets to a separate library, Qtwidgets and left only the basics in Qtgui. I can usually adapt Pyqt4 to Pyqt5 easily. I think the reverse works too.

Well, I did as follows: I put what I want to be displayed to each screen in a container (Qgroupbox) and hid. Then, just give the command name_do_container.Hide() so that the current content disappears and name_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 Pushbuttons, I added a property 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 display, where, simply, adding to the Index of the display array the value of the step_value property of the calling object of the function. The code is this one that’s down there.

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_())

Browser other questions tagged

You are not signed in. Login or sign up in order to post.