Python 3.x 在对话框(QDialog)PyQt5之间切换

Python 3.x 在对话框(QDialog)PyQt5之间切换,python-3.x,qt5,pyqt5,Python 3.x,Qt5,Pyqt5,我的目标是通过单击“下一步”按钮并关闭上一个对话框,将应用程序中的对话框切换到另一个对话框。因此,我有一个开始脚本: from PyQt5.QtWidgets import QApplication, QDialog from gui.Ui_base import Ui_Base if __name__ == "__main__": import sys app = QApplication(sys.argv) window = QDialog() ui = U

我的目标是通过单击“下一步”按钮并关闭上一个对话框,将应用程序中的对话框切换到另一个对话框。因此,我有一个开始脚本:

from PyQt5.QtWidgets import QApplication, QDialog
from gui.Ui_base import Ui_Base

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = QDialog()
    ui = Ui_Base()
    ui.setupUi(window)

    window.show()
    sys.exit(app.exec_())
然后它进入这个对话框,它的GUI是由PUIC5创建的:

from PyQt5 import QtCore, QtGui, QtWidgets
from gui.Ui_scripts import Ui_Scripts

class Ui_Base(QtWidgets.QDialog):
    def setupUi(self, Base):
        """Here goes a lot of code for creating gui like size, place and etc."""
        self.nextButton = QtWidgets.QPushButton(Base)
        self.nextButton.clicked.connect(self.openScripts)
        QtCore.QMetaObject.connectSlotsByName(Base)

    def openScripts(self, Base):
        scriptsWindow = QDialog()
        scriptsUi = Ui_Scripts()
        scriptsUi.setupUi(scriptsWindow)
        Base.close()
        scriptsWindow.show()
        scriptsWindow.exec_()
我得到一个错误:

   File "/Users/max/Project/gui/Ui_base.py", line 125, in openScripts Base.close()
AttributeError: 'bool' object has no attribute 'close'
所以,实际上它会打开下一个对话框,但不会隐藏当前对话框。我尝试了QDialog的其他方法,如hide()和other,但没有任何效果。我真的不理解is Base(实际上是一个窗口)bool??谢谢。

首先,您不需要(也不应该)在对话框中同时调用
show()
exec()
exec()
将调用
show()
作为其操作的一部分,并一直阻止,直到对话框被
接受
拒绝

这让我想到:
QDialog
的结尾有一个特殊的语义,即被
接受
或被
拒绝
的概念。如果需要按钮关闭
QDialog
,只需将其连接到
accept
插槽或
reject
插槽即可。当发出该信号时,对话框将关闭,其返回代码将设置为
已接受
已拒绝

self.nextButton.clicked.connect(self.accept)
代码的另一个问题是向插槽发出信号,希望该插槽接受
bool
作为参数(表示单选/检查按钮的
checkState
)。它不发送类引用。这就是为什么你会得到例外

一般来说,您不会从对话框内部链接对话框。首先,一旦第一个对话框关闭,它也将关闭它的子对话框,这不是您想要的,因为这将关闭您的新对话框。对话框可以弹出其他对话框,但仅当新对话框是旧对话框的“子”时才应使用,因为默认情况下,它将是模态对话框,并阻止父对话框(这是您看到的行为)。实现行为的正确方法是检查调用
window.exec()
的返回代码,如下所示:

accepted = window.exec_()
if accepted == QDialog.Accepted:
   # open the next dialog, user accepted
   accepted = scriptsWindow.exec_()
else:
   # Do what you should if the user rejects the dialog, if that's possible.

基本上,您应该创建一个单独的控制状态机,根据每个对话框是被接受还是被拒绝,循环遍历对话框集。总的来说,我建议您再看一遍,它非常详细地描述了如何处理对话框以及它们的常用/实现模式。

为什么不
self.close()
?还有,应该是scriptsWindow.exec_uu()是的,不是exec而是exec_u,但它不会影响它。对于self.close()对话框(Base),它只是停留在新对话框的后面,但不会消失。感谢您的回复,我最好在实现之前阅读文档。