如何多次来回切换pyqt5对话框?

时间:2019-05-20 00:56:23

标签: python pyqt pyqt5

我想多次在对话框之间切换,但是我现在拥有的代码只进行了两次切换,然后才停止。

  1. 第一个对话框到第二个对话框(没有问题)
  2. 第二个对话框到第一个对话框(没有问题)
  3. 第一个对话框到第二个对话框(所以当我尝试再次转到第二个对话框时,代码停止运行)

我尝试设置可见性为True和False而不是关闭对话框,并且还使用Dialog.exec_()而不是Dialog.exec()

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(633, 242)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(120, 70, 401, 81))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

        self.pushButton.clicked.connect(self.page_2)

    def page_2(self):
        start_D2()

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog_1"))
        self.pushButton.setText(_translate("Dialog", "Go to Second Page"))


class Ui_Dialog_2(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(633, 242)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(120, 70, 401, 81))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

        self.pushButton.clicked.connect(self.page_1)

    def page_1(self):
        start_D1()

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog_2"))
        self.pushButton.setText(_translate("Dialog", "Go to First Page"))


def start_D2():
    try:

        Dialog.close()
        ui = Ui_Dialog_2()
        ui.setupUi(Dialog_2)
        Dialog_2.exec()
    except Exception as e:
        print(e)


def start_D1():
    try:

        Dialog_2.close()
        ui = Ui_Dialog()
        ui.setupUi(Dialog)
        Dialog.exec()
    except Exception as e:
        print(e)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)

    Dialog = QtWidgets.QDialog()
    Dialog_2 = QtWidgets.QDialog()

    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

我需要的是每次单击按钮时都切换一次对话框,而不仅仅是一次或两次。

1 个答案:

答案 0 :(得分:0)

您遇到以下错误:

  • 出于效率考虑,Qt不会抛出异常,因此没有必要使用try-except。
  • PyQt我建议不要修改QtDesigner生成的代码,因为它首先不是小部件,它只是用于填充小部件的类。相反,您必须创建另一个继承适当窗口小部件的类,并使用初始类来填充它。有关更多信息,请阅读docs

解决方案是,当您按下按钮时,关闭同一对话框并打开另一个窗口。

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(633, 242)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(120, 70, 401, 81))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog_1"))
        self.pushButton.setText(_translate("Dialog", "Go to Second Page"))


class Ui_Dialog_2(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(633, 242)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(120, 70, 401, 81))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog_2"))
        self.pushButton.setText(_translate("Dialog", "Go to First Page"))


class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        # close the window
        self.pushButton.clicked.connect(self.close)


class Dialog2(QtWidgets.QDialog, Ui_Dialog_2):
    def __init__(self, parent=None):
        super(Dialog2, self).__init__(parent)
        self.setupUi(self)
        # close the window
        self.pushButton.clicked.connect(self.close)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w1 = Dialog()
    w2 = Dialog2()
    # open another dialog
    w1.pushButton.clicked.connect(w2.show)
    w2.pushButton.clicked.connect(w1.show)
    w1.show()
    sys.exit(app.exec_())