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

5
# -*- 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_())

这是对话框文件代码

我有一个主窗口表单,上面有一个行编辑器l1和一个按钮B1。 点击按钮B1会打开一个新的对话框窗口。 对话框窗口有一个行编辑器l2和一个按钮B2。 我在l2中写入一些内容,然后在对话框窗口中点击b2。 如何在点击b2时将l2中的数据发送到mainwindow的l1中,并关闭对话框窗口并返回控制权到mainwindow。


请展示你的代码。 - eyllanesc
我可以把其中一部分发邮件吗? - Sahil Jain
put it here please - eyllanesc
现在的问题是我无法将数据发送回主窗口并控制它。 - Sahil Jain
尝试使用我的答案。;P - eyllanesc
2个回答

9

建议不要修改生成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将它们恢复回来。

很好,这对我的测试起作用,只需要在主代码中实现即可。 - Sahil Jain
类型错误:参数不匹配任何重载调用: 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” - Sahil Jain
你能告诉我为什么会出现这个错误吗?即使我们注释掉这些行,文件也可以正常工作。这些行是用来做什么的?因为在我的main.ui中没有对ui文件进行任何更改,但每次都会出现这个问题,而且每次编译时我都必须更改main.py中的qrc路径。 - Sahil Jain
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” - Sahil Jain
抱歉,未经允许无法分享项目,但非常感谢您的帮助,我也解决了这个错误,非常感谢 :) - Sahil Jain

1
你可以像之前一样,将对话框上的按钮与主应用程序中的函数连接起来。
请按照以下方式更新你的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()

在命名变量时,你也需要小心。如果使用已经被占用的占位符,将来可能会出现错误。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接