2014-07-25 39 views
1

我的目标是简单地通过单击“下一步”按钮将应用程序中的对话框切换到另一个,然后关闭前一个对话框。所以,我有一个启动脚本:在对话框之间切换(QDialog)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_()) 

然后进入此对话框,它的图形用户界面是由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' 

所以,实际上它打开了下一个对话框,但不隐藏当前的对话框。我尝试了像hide()和其他方法的QDialog的其他方法,但没有任何工作。而且我并不真正跟Base(实际上是一个窗口)bool?谢谢。

+0

为什么不'self.close()'?另外,应该是scriptsWindow.exec_() – mdurant

+0

是的,不是exec而是exec_,但它不会影响它。与self.close()对话框(基地)只是留在新的一个,但不会消失。 – boyks

回答

1

首先,您不需要(也不应该)在对话框上同时拨打show()exec_()exec_()将调用show()作为其操作的一部分,并阻止,直到对话框AcceptedRejected

这使我想到:QDialog有其收盘,为AcceptedRejected概念的特殊的语义。如果您想要一个按钮来关闭QDialog,您只需将其连接到accept插槽或reject插槽。当该信号发出时,对话框将关闭,它的返回码将被设置为acceptedrejected

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,它详细描述了如何处理对话以及常见的使用/实现模式。

+0

感谢您的回复,我应该在实施前更好地阅读文档。 – boyks