在对话框之间切换(QDialog)PyQt5

时间:2014-07-25 13:42:58

标签: 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 = Ui_Base()
    ui.setupUi(window)

    window.show()
    sys.exit(app.exec_())

然后它进入该对话框,它的GUI由pyuic5创建:

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()和其他方法,但没有任何效果。而且我真的不太喜欢Base(实际上是一个窗口)bool ??感谢。

1 个答案:

答案 0 :(得分:2)

首先,您不应该(并且不应该)在对话框上同时调用show()exec_()exec_()会在show()Accepted

这让我想到:Rejected对于结束有一个特殊的语义,即QDialogAccepted的概念。如果您想要一个按钮关闭Rejected,只需将其连接到QDialog广告位或accept广告位即可。发出该信号后,对话框将关闭,其返回码将设置为rejectaccepted

rejected

您的代码的另一个问题是QPushbutton.clicked向插槽发出信号,希望该插槽接受self.nextButton.clicked.connect(self.accept) 作为参数(表示收音机/检查按钮的bool )。它没有发送类引用。这就是你得到例外的原因。

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

window.exec_()

基本上,您应该创建一个单独的控制状态机,根据是否接受或拒绝每个对话框,循环访问对话框。一般来说,我建议您一次性给出QDialog Documentation一个,它详细描述了如何处理对话框以及它们的常用用途/实现模式。