2011-04-22 51 views
8

我正在嘗試將自定義對話框添加到我可以啓動的當前GUI,以供用戶設置一些參數。理想情況下,我想使用QtDesigner創建自定義對話框。下面是從對話框的QtDesigner UI代碼生成pyuic4的代碼。PyQt4:創建一個返回參數的自定義對話框

from PyQt4 import QtCore, QtGui 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(508, 300) 
     self.buttonBox = QtGui.QDialogButtonBox(Dialog) 
     self.buttonBox.setGeometry(QtCore.QRect(150, 250, 341, 32)) 
     self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 
     self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) 
     self.buttonBox.setObjectName("buttonBox") 
     self.label = QtGui.QLabel(Dialog) 
     self.label.setGeometry(QtCore.QRect(10, 120, 181, 31)) 
     font = QtGui.QFont() 
     font.setPointSize(16) 
     self.label.setFont(font) 
     self.label.setObjectName("label") 
     self.sl_value = QtGui.QSlider(Dialog) 
     self.sl_value.setGeometry(QtCore.QRect(220, 120, 161, 31)) 
     self.sl_value.setOrientation(QtCore.Qt.Horizontal) 
     self.sl_value.setObjectName("sl_value") 
     self.ed_value = QtGui.QLineEdit(Dialog) 
     self.ed_value.setGeometry(QtCore.QRect(400, 120, 41, 31)) 
     font = QtGui.QFont() 
     font.setPointSize(16) 
     self.ed_value.setFont(font) 
     self.ed_value.setObjectName("ed_value") 
     self.retranslateUi(Dialog) 
     QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), Dialog.accept) 
     QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), Dialog.reject) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 


    def retranslateUi(self, Dialog): 
     Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) 
     self.label.setText(QtGui.QApplication.translate("Dialog", "Set example value:", None, QtGui.QApplication.UnicodeUTF8)) 

這是保存在Sub2.py 然後,在我的主要Python文件,我添加

from Sub2 import Ui_Dialog 

我創建了一個名爲StartSub2新類用下面的代碼

class StartSub2(QtGui.QDialog): 
    def __init__(self,parent=None): 
     QtGui.QDialog.__init__(self,parent) 
     self.ui = Ui_Dialog 
     self.ui.setupUi(self) 

後來總算在我的主GUI中有一個函數,下面的代碼應該啓動對話框

def exampleSubGui(self): 
    dialog = StartSub2(self) 
    result = dialog.exec_() 

請注意,對話框沒有完成。一旦我解決了如何啓動它,我將添加滑塊和編輯框的信號/插槽連接。另外,如果我理解正確,我需要重載accept()方法來返回用戶的輸入。

我遇到的第一個問題是StartSub2__init__方法。我得到以下錯誤:

TypeError: unbound method setupUi() must be called with Ui_Dialog instance as 
first argument (got StartSub2 instance instead) 

我試圖採取同樣的做法,主要的GUI正在它使用下面的代碼

class StartQT4(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

但這並不抱怨setupUi()得到一個StartQT4實例而不是Ui_MainWindow實例。任何人都可以解釋正確的方式來完成我想要做的事情嗎?或者有人可以給我一個清晰的例子或參考?如果您需要更多信息或澄清,請告訴我。

回答

17
class StartSub2(QtGui.QDialog, Ui_Dialog): 
    def __init__(self,parent=None): 
     QtGui.QDialog.__init__(self,parent) 
     self.setupUi(self) 

應該解決你的第一個讓對話框初始化的問題。

爲了得到信息後,我通常會添加一個名爲像getValuesStartSub2方法,即

def getValues(self): 
    return somethingUseful 

然後做

dlg = StartSub2() 
if dlg.exec_(): 
    values = dlg.getValues() 
    # Do stuff with values 
+0

非常感謝你。這正是我所期待的。 – Thomas 2011-04-25 13:49:17

+0

值得注意的是,如果你的self.close()對話框(從.exec()返回的值爲0),你不得不使用self.accept()。起初這個問題並不完全清楚,從問題中的老派SIGNAL語法來看。 – Taran 2015-06-30 06:13:04

相關問題