如何从 Python 中的 QDialog 实例返回值?

Posted

技术标签:

【中文标题】如何从 Python 中的 QDialog 实例返回值?【英文标题】:How to return values from a QDialog instance in Python? 【发布时间】:2014-08-11 19:13:41 【问题描述】:

我正在尝试打开一个 QtGui.QDialog,向用户请求一组值,然后在单击“保存”后返回这些值。

以下代码无需修改即可运行。

import sys
from PySide import QtCore, QtGui
import numpy as np

class MyQDialog(QtGui.QDialog):

    def __init__(self, parent=None):
        super(MyQDialog, self).__init__(parent)

        ## Default values

        self.eta1 = 1.0
        self.eta2 = 1.0

        ## Create labels and buttons

        frameStyle = QtGui.QFrame.Sunken | QtGui.QFrame.Panel

        self.eta1__QL = QtGui.QLabel(str(self.eta1))
        self.eta1__QL.setFrameStyle(frameStyle)
        self.eta1__QBtn = QtGui.QPushButton("Set eta1:")

        self.eta2__QL = QtGui.QLabel(str(self.eta2))
        self.eta2__QL.setFrameStyle(frameStyle)
        self.eta2__QBtn = QtGui.QPushButton("Set eta2:")

        self.cancel__QBtn = QtGui.QPushButton("Cancel")
        self.save__QBtn = QtGui.QPushButton("Save")

        self.eta1__QBtn.clicked.connect(self.set_eta1)
        self.eta2__QBtn.clicked.connect(self.set_eta2)
        self.cancel__QBtn.clicked.connect(self.cancel)
        self.save__QBtn.clicked.connect(self.save)

        ## Set layout, add buttons

        layout = QtGui.QGridLayout()
        layout.setColumnStretch(1, 1)
        layout.setColumnMinimumWidth(1, 250)

        layout.addWidget(self.eta1__QBtn, 1, 0)
        layout.addWidget(self.eta1__QL, 1, 1)
        layout.addWidget(self.eta2__QBtn, 2, 0)
        layout.addWidget(self.eta2__QL, 2, 1)
        layout.addWidget(self.cancel__QBtn, 3, 0)
        layout.addWidget(self.save__QBtn, 3, 1)

        self.setLayout(layout)

        self.setWindowTitle("Thank you for reading!")

    ## Button functions

    def set_eta1(self):
        self.eta1, ok = QtGui.QInputDialog.getDouble(self,
                "Change of variable", "Rate (type 1):", 0.1, 0, 1e8, 3)
        if ok:
            self.eta1__QL.setText(str(self.eta1))

    def set_eta2(self):
        self.eta2, ok = QtGui.QInputDialog.getDouble(self,
                "Change of variable", "Rate (type 2):", 0.3, 0, 1e8, 3)
        if ok:
            self.eta2__QL.setText(str(self.eta2))

    def cancel(self):
        self.close()

    def save(self):
        return self.eta2, self.eta2


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    edit_params__QD = MyQDialog()

    if edit_params__QD.exec_():
        value1, value2 = edit_params__QD.save()

        print 'Success!', value1, value2
    else:
        print 'I shouldn\'t print, but I do.'

    sys.exit()

非常感谢您的宝贵时间!非常感谢任何改进建议!

【问题讨论】:

保存按钮在您的程序中完全没有任何功能。 【参考方案1】:

更改此行中的返回值:

def save(self): 
    return self.eta2, self.eta2

to:返回self.eta1,self.eta2

在 main 中(当然你需要导入 sys):

app = QtGui.QApplication(sys.argv)
edit_params__QD = MyQDialog()
edit_params__QD.exec_()
if edit_params__QD.result() == 0:
    value1, value2 = edit_params__QD.save()
    print('Success!', value1, value2)

将第二个连接添加到您已有的连接:

self.save__QBtn.clicked.connect(self.save) 
self.save__QBtn.clicked.connect(self.close)

我希望这会有所帮助。

【讨论】:

以上是关于如何从 Python 中的 QDialog 实例返回值?的主要内容,如果未能解决你的问题,请参考以下文章

MFC 应用程序中的 Qt DLL - 如何使 QDialog *真正* 模态?

如何从另一个 QDialog 访问组合框的文本并将其写入该对话框中的 lineEdit

如何从QDialog刷新/更新/重绘QMainWindow?

如何更改 QDialog 中的默认按钮行为

如何摆脱 QDialog 中的调整大小句柄?

从文件中动态更新 Qdialog 中的 QTextBrowser(由另一个作业更新)