Как переключать диалоги pyqt5 несколько раз назад и вперед? - PullRequest
2 голосов
/ 20 мая 2019

Я хочу переключаться между диалоговыми окнами несколько раз, но код, который у меня есть сейчас, выполняет переключение только 2 раза, а затем просто останавливается.

  1. первый диалог ко второму диалогу (без проблем)
  2. второй диалог к ​​первому диалогу (без проблем)
  3. Первый диалог ко второму диалогу (поэтому, когда я снова пытаюсь перейти ко второму диалогу, код перестает работать)

У меня естьпопытался установить видимость Истина и Ложь вместо закрытия диалогового окна, а также использовал 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 голосов
/ 20 мая 2019

У вас есть следующие ошибки:

  • Qt для эффективности не выдает исключений, поэтому не нужно использовать try-исключением.
  • PyQt Я рекомендую не изменять код, сгенерированный QtDesigner, потому что это не виджет, а просто класс, используемый для заполнения виджета. Вместо этого вы должны создать другой класс, который наследует соответствующий виджет, и использовать начальный класс для его заполнения. Для получения дополнительной информации прочитайте документы .

Решение состоит в том, что когда вы нажимаете кнопку, закрываете тот же диалог и открываете другое окно.

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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...