python-3.x - 在对话框之间切换(QDialog)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 = 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() 等,但没有任何效果。我真的不明白 is Base (实际上是一个窗口) bool?谢谢。

最佳答案

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

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

self.nextButton.clicked.connect(self.accept)

您的代码的另一个问题是 QPushbutton.clicked向插槽发出信号,期望该插槽接受 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.

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

关于python-3.x - 在对话框之间切换(QDialog)PyQt5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24957181/

相关文章:

python - 为什么即使值不存在,python 的 bisect_left 也会返回有效索引?

Python如何在两个列表之间找到一个不完全相同的单词?

python-3.x - QListWidgetItem 内的小部件在内部移动后消失

c++ - 从 QGroupBox 中删除标题

python - 如何在不同类的 Main Widget 和 QObject 之间传递数据

python - 如何使用 python PyQt5 确定我的应用程序(窗口)的事件屏幕(监视器)?

python - 如何检测 QInputDialog 中值的变化?

python - 如何在退出主线程之前确保队列为空

python - numpy - 使用一些预先计算的映射有效地将值从矩阵复制到矩阵

qt - 在Qt5中创建静态库并使用它