PyQt4:创建一个返回参数的自定义对话框

Tho*_*mas 9 python user-interface pyqt4

我正在尝试向我当前的GUI添加一个自定义对话框,可以为用户启动以设置一些参数.理想情况下,我想使用QtDesigner创建自定义对话框.下面是pyuic4对话框的QtDesigner ui 代码生成的代码.

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))
Run Code Online (Sandbox Code Playgroud)

这保存在Sub2.py 然后,在我的主python文件中,我添加

from Sub2 import Ui_Dialog
Run Code Online (Sandbox Code Playgroud)

我创建了一个StartSub2使用以下代码调用的新类

class StartSub2(QtGui.QDialog):
    def __init__(self,parent=None):
        QtGui.QDialog.__init__(self,parent)
        self.ui = Ui_Dialog
        self.ui.setupUi(self)
Run Code Online (Sandbox Code Playgroud)

最后在我的主GUI里面有一个函数,下面的代码应该启动对话框

def exampleSubGui(self):
    dialog = StartSub2(self)
    result = dialog.exec_()
Run Code Online (Sandbox Code Playgroud)

请注意,对话框尚未完成.一旦我解决了如何启动它,我将为滑块和编辑框添加信号/插槽连接.另外,如果我理解正确,我需要重载该accept()方法以返回用户的输入.

我遇到的第一个问题是使用__init__方法StartSub2.我收到以下错误:

TypeError: unbound method setupUi() must be called with Ui_Dialog instance as
first argument (got StartSub2 instance instead)
Run Code Online (Sandbox Code Playgroud)

我试图采用与使用以下代码的主GUI相同的方法

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
Run Code Online (Sandbox Code Playgroud)

但这不会抱怨setupUi()获取StartQT4实例而不是Ui_MainWindow实例.任何人都可以解释完成我想要做的事情的正确方法吗?或者有人能指出我一个明确的例子或参考?如果您需要更多信息或说明,请与我们联系.

Wha*_*ang 18

class StartSub2(QtGui.QDialog, Ui_Dialog):
    def __init__(self,parent=None):
        QtGui.QDialog.__init__(self,parent)
        self.setupUi(self)
Run Code Online (Sandbox Code Playgroud)

应解决您初始化对话框的第一个问题.

为了得到信息后,我通常会添加一个名为类似的方法getValuesStartSub2,即

def getValues(self):
    return somethingUseful
Run Code Online (Sandbox Code Playgroud)

然后做

dlg = StartSub2()
if dlg.exec_():
    values = dlg.getValues()
    # Do stuff with values
Run Code Online (Sandbox Code Playgroud)