多窗口,窗口和对话框之间很多时候都需要互相传递数据,这是使用PyQt编写较为复杂的界面软件不可或缺的环节。
Qt 中信号、槽的概念和 PyQt 的环境配置 此处不多讲,假定读者已了解和熟悉。
1 场景
如下:
该场景是单向的 dlg 将数据传输给 win,下面看代码如何实现。
2 代码
声明:代码环境为:python 3.7, pyqt5,pycharm,需事先配置好pyqt环境(可参考此文)。
仅列出关键代码。
2.1 主窗口 win 代码
# 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. 编写槽函数。
2.2 对话框代码
# 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. 发射信号
上述代码仅是用法示意,不能直接运行,因为对话框类我省略了较多的代码 。
原文地址:https://www.jb51.cc/wenti/3281887.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。