我的目标只是通过单击“下一步”按钮将应用程序中的对话框切换到另一个,然后关闭前一个按钮。所以,我有一个起始脚本:
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 ??感谢。
答案 0 :(得分:2)
首先,您不应该(并且不应该)在对话框上同时调用show()
和exec_()
。 exec_()
会在show()
或Accepted
Rejected
对于结束有一个特殊的语义,即QDialog
或Accepted
的概念。如果您想要一个按钮关闭Rejected
,只需将其连接到QDialog
广告位或accept
广告位即可。发出该信号后,对话框将关闭,其返回码将设置为reject
或accepted
:
rejected
您的代码的另一个问题是QPushbutton.clicked
向插槽发出信号,希望该插槽接受self.nextButton.clicked.connect(self.accept)
作为参数(表示收音机/检查按钮的bool
)。它没有发送类引用。这就是你得到例外的原因。
一般来说,你不能从内部链接对话框。首先,一旦第一个对话框关闭,它也将关闭它的子节点,这不是你想要的,因为这将关闭你的新对话框。对话框可以弹出其他对话框,但只有在新对话框是“孩子”时才能使用。旧的,因为默认情况下它将是模态的并阻止父对话框(这是你看到的行为)。实现行为的正确方法是检查调用checkState
的返回代码,如下所示:
window.exec_()
基本上,您应该创建一个单独的控制状态机,根据是否接受或拒绝每个对话框,循环访问对话框。一般来说,我建议您一次性给出QDialog Documentation一个,它详细描述了如何处理对话框以及它们的常用用途/实现模式。