如何在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添加到主窗口的工具栏