多窗口,窗口和对话框之间很多时候都需要互相传递数据,这是使用PyQt编写较为复杂的界面软件不可或缺的环节。
Qt 中信号、槽的概念和 PyQt 的环境配置 此处不多讲,假定读者已了解和熟悉。
如下:
该场景是单向的 dlg 将数据传输给 win,下面看代码如何实现。
声明:代码环境为:python 3.7, pyqt5,pycharm,需事先配置好pyqt环境(可参考此文)。
仅列出关键代码。
- # python3.7,pyqt5
-
- from PyQt5.QtCore import QObject, pyqtSignal
-
- from PyQt5 import QtCore, QtGui, QtWidgets
- from PyQt5.QtWidgets import QDialog
- import mydlg # 导入 mydlg.py 文件
-
-
- class MyWin(QMainWindow):
- def __init(self)__:
- self.inputDlg = None # 给对话框占个坑,变成成员变量
- pass
-
- def addInfo()
- # 必须使用成员变量形式
- # 如果dlg是本函数的局部变量, addInfo函数执行完就会释放局部变量,窗口直接就被销毁
- self.inputDlg = mydlg.MyDlg(mainwin=self) # 调用mydlg.py内的类MyDlg
- self.inputDlg.show()
-
- # 槽函数
- def slotSaveInfo(uname, uage)
- print(uname, uage) # 打印接收的数据
- self.inputDlg.close() # 对话框任务完成,关闭它
注意:信号一定要在窗体类内、成员函数外定义,即信号和成员函数是同级别的。
信号不要在成员函数中定义,否则会报错:
'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
将文件保存为 mymain.py。
主窗口(接收信号方)的重点是:
1. 编写槽函数。
- # python3.7,pyqt5
-
- from PyQt5.QtCore import QObject, pyqtSignal
-
- from PyQt5 import QtCore, QtGui, QtWidgets
- from PyQt5.QtWidgets import QDialog
-
-
- class MyDlg(QDialog):
-
- # 注意:信号必须在类内,成员函数外
- mysignal = pyqtSignal(str, str) # 此处参数填写数据类型,也可是list,dict,tuple等
-
- def __init(self, mainwin)__: # 构造函数增加了个参数,用于保存调用者,即主窗口类
- # 保存主窗口的引用,绑定信号的槽时需要引用槽所在的类
- self.mainwin = mainwin
- self.mysignal.connect(self.mainwin.slotSaveInfo)
-
- # 输入框和保存按钮等UI代码省略
-
- # 点击保存按钮触发本函数
- def btn_click(self):
- # 发射信号
- uname = "Tom"
- uage = "12"
- self.mysignal.emit(uname, uage)
将对话框代码保存为 mydlg.py 文件,和主窗口文件 mymain.py 放在同一目录。
对话框(发射信号的窗口)的代码重点是:
1. 定义信号
2. 绑定信号和槽
3. 发射信号
上述代码仅是用法示意,不能直接运行,因为对话框类我省略了较多的代码 。