首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PyQt4:创建返回参数的自定义对话框

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

Stack Overflow用户
提问于 2011-04-23 06:20:09
回答 2查看 27.8K关注 0票数 10

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

代码语言:javascript
复制
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文件中,我添加了

代码语言:javascript
复制
from Sub2 import Ui_Dialog

我用以下代码创建了一个名为StartSub2的新类

代码语言:javascript
复制
class StartSub2(QtGui.QDialog):
    def __init__(self,parent=None):
        QtGui.QDialog.__init__(self,parent)
        self.ui = Ui_Dialog
        self.ui.setupUi(self)

最后,在我的主GUI中,有一个函数,其中包含以下代码,可以启动该对话框

代码语言:javascript
复制
def exampleSubGui(self):
    dialog = StartSub2(self)
    result = dialog.exec_()

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

我遇到的第一个问题是StartSub2__init__方法。我得到以下错误:

代码语言:javascript
复制
TypeError: unbound method setupUi() must be called with Ui_Dialog instance as
first argument (got StartSub2 instance instead)

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

代码语言:javascript
复制
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实例。有谁能解释一下完成我正在尝试做的事情的正确方法吗?或者有人能给我一个清晰的例子或参考资料?如果您需要更多信息或澄清,请让我知道。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-23 06:51:49

代码语言:javascript
复制
class StartSub2(QtGui.QDialog, Ui_Dialog):
    def __init__(self,parent=None):
        QtGui.QDialog.__init__(self,parent)
        self.setupUi(self)

应该可以解决让对话框初始化的第一个问题。

为了获取信息,我通常会向StartSub2添加一个类似于getValues的方法。

代码语言:javascript
复制
def getValues(self):
    return somethingUseful

那就这么做

代码语言:javascript
复制
dlg = StartSub2()
if dlg.exec_():
    values = dlg.getValues()
    # Do stuff with values
票数 18
EN

Stack Overflow用户

发布于 2018-06-05 05:52:04

我只想为设置一个带有返回值的自定义对话框提供我自己的答案(没有回答代码特定的问题,Whatang已经这样做了)。

我发现使用class method构造一个简单的对话框类会更简洁一些,它可以根据需要返回不同的内容。我最近做了很多这个!这个想法是,类方法将构造对话框类的一个实例,并返回实例外的对象(在本例中是bool ok),这或多或少是一个factory method (据我所知,这对于OOP来说还是有些新的)。

这是一个非常简单的示例对话框。将其扩展到对话框类中所需的任何内容应该相对容易:

代码语言:javascript
复制
class OkDialog(QtGui.QDialog):
    def __init__(self, parent):
        super(OkDialog, self).__init__(parent)

        self.ok = False

        self.btn_ok = QtGui.QPushButton("Ok", self)
        self.btn_ok.clicked.connect(self.button_press)
        self.btn_cancel = QtGui.QPushButton("Cancel", self)
        self.btn_cancel.clicked.connect(self.button_press)
        self.btn_cancel.move(80, 0)

    def button_press(self):
        if self.sender() == self.btn_ok:
            self.ok = True
        self.close()

    @classmethod
    def isOkay(cls, parent):
        dialog = cls(parent)
        dialog.exec_()
        return dialog.ok

它的美妙之处在于,当需要构造此对话框时,您只需使用一行OkDialog.isOkay(parent)即可完成。将其放到一个完整的工作示例中:

代码语言:javascript
复制
import sys
from PyQt4 import QtCore, QtGui

class OkDialog(QtGui.QDialog):
    def __init__(self, parent):
        super(OkDialog, self).__init__(parent)

        self.ok = False

        self.btn_ok = QtGui.QPushButton("Ok", self)
        self.btn_ok.clicked.connect(self.button_press)
        self.btn_cancel = QtGui.QPushButton("Cancel", self)
        self.btn_cancel.clicked.connect(self.button_press)
        self.btn_cancel.move(80, 0)

    def button_press(self):
        if self.sender() == self.btn_ok:
            self.ok = True
        self.close()

    @classmethod
    def isOkay(cls, parent):
        dialog = cls(parent)
        dialog.exec_()
        return dialog.ok

class Ui_Dialog(QtGui.QDialog):
    def __init__(self):
        super(Ui_Dialog, self).__init__()

        button = QtGui.QPushButton("Launch custom dialog", self)
        button.pressed.connect(self.launch_dialog)

    def launch_dialog(self):
        print OkDialog.isOkay(self)

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Ui_Dialog()

    ex.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5760622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档