如何在pyqt中从对话框窗口检索数据到主窗口?

Posted

技术标签:

【中文标题】如何在pyqt中从对话框窗口检索数据到主窗口?【英文标题】:How to retrieve data from dialog window to mainwindow in pyqt? 【发布时间】:2017-09-25 09:15:35 【问题描述】:
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'maintest.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui
from test import Ui_Dialog

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):

    def connect(self):
        self.updateWindow=QtGui.QDialog()
        self.ui_update=Ui_Dialog()
        self.ui_update.setupUi(self.updateWindow)
        self.updateWindow.show()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(391, 248)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.lineEdit = QtGui.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(80, 60, 113, 27))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(80, 100, 112, 34))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 391, 31))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.pushButton.setText(_translate("MainWindow", "B1", None))
        self.pushButton.clicked.connect(self.connect)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

这是主文件代码

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):

    def save_data(self):
        d= self.lineEdit.text()
        print(d)

    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(397, 219)
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(110, 100, 112, 34))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.lineEdit = QtGui.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(110, 60, 113, 27))
        self.lineEdit.setText(_fromUtf8(""))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.pushButton.setText(_translate("Dialog", "B2", None))
        self.pushButton.clicked.connect(self.save_data)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

这是对话框文件代码

我有一个主窗口窗体,上面有一个 lineedit l1 和一个按钮 B1。 单击按钮 B1 时,将打开一个新的对话窗口。 对话窗口有一个 lineedit l2 和一个按钮 B2。 我在 l2 中写了一些东西,然后在对话窗口中单击 b2。 如何在主窗口中单击 b2 到 l1 时在 l2 中发送我的数据,并在单击按钮 b2 后关闭对话框窗口并将控制权返回到主窗口

【问题讨论】:

请出示您的代码 我可以通过电子邮件发送一些吗? 请放在这里 现在的问题是我无法将数据发送回主窗口并返回对它的控制 试试我的回答。 ;P 【参考方案1】:

始终建议不要弄乱生成 Qt Designer 的代码,最好创建另一个实现逻辑的文件。此外,Qt Designer 生成一个设计类,它不是小部件,但用于填充小部件。所以建议创建一个实现逻辑的类并使用设计。

切入正题,如果您想在按下QPushButton 时关闭对话框,请将clicked 信号连接到close() 方法。如果您想获取QDialog 的一些数据,最简单的形式之一是首先使用exec_() 方法显示对话框,因为它会生成自己的循环并且当窗口关闭时,以下代码行是执行。

class Dialog(QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.close)

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.onClicked)

    def onClicked(self):
        updateDialog = Dialog()
        updateDialog.exec_()
        self.lineEdit.setText(updateDialog.lineEdit.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

注意:我建议删除您在设计中所做的更改或使用 pyuic 恢复它们

【讨论】:

这对我的测试很有用,只需要在主代码中实现。 TypeError: 参数不匹配任何重载调用:QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): 参数 1 具有意外类型 'bool ' QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): 参数 1 具有意外类型 'bool' QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt。 AutoConnection): 参数 1 具有意外类型“bool” 你能告诉我为什么会出现这个错误吗?如果我们注释掉这些行,文件甚至可以工作。这些行是做什么用的?因为在我的 main.ui 中我没有对 ui 文件进行任何更改,我每次都得到这个,而且我每次编译时都必须更改 main.py 中的 qrc 路径 QtCore.QObject.connect(self.close, QtCore.SIGNAL(_fromUtf8("triggered()")), MainWindow.close) 类型错误:参数不匹配任何重载调用:QObject.connect( QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): 没有足够的参数 QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): 参数 3 有意外的类型'QAction' QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): 参数 2 有意外的类型 'bytes' 对不起,未经许可不能分享项目,但我很高兴你帮了我这么多,我也解决了这个错误,非常感谢:)【参考方案2】:

您可以将对话框上的按钮与主应用程序中的函数连接起来,就像您已经完成的那样。

像这样更新您的connect 例程:

def connect(self):
        self.updateWindow=QtGui.QDialog()
        self.ui_update=Ui_Dialog()
        self.ui_update.setupUi(self.updateWindow)
        self.ui_update.pushButton.connect(self.printContent)
        self.updateWindow.show()

def printContent(self):
     print self.ui_update.lineEdit.text()

您还应该注意变量的名称。如果您使用已被占用的占位符,将来会发生错误。

【讨论】:

我不想从另一个窗口打印数据,而是将该数据返回到 mainwindow 并使用它

以上是关于如何在pyqt中从对话框窗口检索数据到主窗口?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt:如何将选择的 Combobox 值从 QDialog 传递到主窗口?

如何在python中使用pyqt5将QSlider添加到主窗口的工具栏

如何在不影响 Pyqt5 中的小部件的情况下将背景图像添加到主窗口

在 PyQt 中关闭窗口后如何检索属性值?

在 PyQt 的子窗口中从父窗口访问数据

PyQt - 如何在不关闭对话框窗口的情况下停止执行