在对话框之间切换(QDialog)PyQt5
Posted
技术标签:
【中文标题】在对话框之间切换(QDialog)PyQt5【英文标题】:Switching between dialogs (QDialog) PyQt5 【发布时间】:2014-07-25 13:42:58 【问题描述】:我的目标只是通过单击“下一步”按钮将应用程序中的对话框切换到另一个,然后关闭前一个。所以,我有一个起始脚本:
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 吗?谢谢。
【问题讨论】:
为什么不self.close()
?另外,应该是scriptsWindow.exec_()
是的,不是 exec 而是 exec_,但不影响它。而使用 self.close() 对话框(Base)只是停留在新对话框后面,但不会消失。
【参考方案1】:
首先,您不需要(也不应该)在对话框中同时调用show()
和exec_()
。 exec_()
将调用 show()
作为其操作的一部分,并阻塞直到对话框为 Accepted
或 Rejected
这让我想到:QDialog
的结束语有一个特殊的语义,即Accepted
或Rejected
的概念。如果您想要一个按钮来关闭QDialog
,只需将其连接到accept
插槽或reject
插槽。当该信号发出时,对话框将关闭,其返回码将设置为accepted
或rejected
:
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 一次,它非常详细地描述了如何处理对话框以及它们的常见使用/实现模式。
【讨论】:
感谢您的回复,我应该在实施之前最好阅读文档。以上是关于在对话框之间切换(QDialog)PyQt5的主要内容,如果未能解决你的问题,请参考以下文章