2014-07-25 38 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