• 【PyQt】多窗口使用信号-槽传递数据


    多窗口,窗口和对话框之间很多时候都需要互相传递数据,这是使用PyQt编写较为复杂的界面软件不可或缺的环节。

    Qt 中信号、槽的概念和 PyQt 的环境配置 此处不多讲,假定读者已了解和熟悉。

    1 场景

    如下:

    • 主窗口 win 弹出个对话框 dlg。
    • 在对话框 dlg 中,用户输入 姓名,年龄,然后点击保存,对话框将用户输入的数据传递给 主窗口 win。【也可以是另外一个win,原理是一样的】
    • 主窗口收到 对话框的数据后,关闭对话框。

    该场景是单向的 dlg 将数据传输给 win,下面看代码如何实现。

    2 代码

    声明:代码环境为:python 3.7, pyqt5,pycharm,需事先配置好pyqt环境(可参考此文)。

    仅列出关键代码。

    2.1 主窗口 win 代码

    1. # python3.7,pyqt5
    2. from PyQt5.QtCore import QObject, pyqtSignal
    3. from PyQt5 import QtCore, QtGui, QtWidgets
    4. from PyQt5.QtWidgets import QDialog
    5. import mydlg # 导入 mydlg.py 文件
    6. class MyWin(QMainWindow):
    7. def __init(self)__:
    8. self.inputDlg = None # 给对话框占个坑,变成成员变量
    9. pass
    10. def addInfo()
    11. # 必须使用成员变量形式
    12. # 如果dlg是本函数的局部变量, addInfo函数执行完就会释放局部变量,窗口直接就被销毁
    13. self.inputDlg = mydlg.MyDlg(mainwin=self) # 调用mydlg.py内的类MyDlg
    14. self.inputDlg.show()
    15. # 槽函数
    16. def slotSaveInfo(uname, uage)
    17. print(uname, uage) # 打印接收的数据
    18. self.inputDlg.close() # 对话框任务完成,关闭它

    注意:信号一定要在窗体类内、成员函数外定义,即信号和成员函数是同级别的。

    信号不要在成员函数中定义,否则会报错:

    'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

    将文件保存为 mymain.py。

    主窗口(接收信号方)的重点是:

    1. 编写槽函数。

    2.2 对话框代码

    1. # python3.7,pyqt5
    2. from PyQt5.QtCore import QObject, pyqtSignal
    3. from PyQt5 import QtCore, QtGui, QtWidgets
    4. from PyQt5.QtWidgets import QDialog
    5. class MyDlg(QDialog):
    6. # 注意:信号必须在类内,成员函数外
    7. mysignal = pyqtSignal(str, str) # 此处参数填写数据类型,也可是list,dict,tuple等
    8. def __init(self, mainwin)__: # 构造函数增加了个参数,用于保存调用者,即主窗口类
    9. # 保存主窗口的引用,绑定信号的槽时需要引用槽所在的类
    10. self.mainwin = mainwin
    11. self.mysignal.connect(self.mainwin.slotSaveInfo)
    12. # 输入框和保存按钮等UI代码省略
    13. # 点击保存按钮触发本函数
    14. def btn_click(self):
    15. # 发射信号
    16. uname = "Tom"
    17. uage = "12"
    18. self.mysignal.emit(uname, uage)

    将对话框代码保存为 mydlg.py 文件,和主窗口文件 mymain.py 放在同一目录。

    对话框(发射信号的窗口)的代码重点是:

    1. 定义信号

    2. 绑定信号和槽

    3. 发射信号

    上述代码仅是用法示意,不能直接运行,因为对话框类我省略了较多的代码 。

  • 相关阅读:
    LiveData粘性事件原理解析
    c++读取文件操作和写入文件
    Apache hudi 核心功能点分析
    Linux+qt:创建动态库so,以及如何使用(详细步骤)
    如何设计一个安全的对外接口?
    Spring中的JdbcTemplate的使用
    2024 Web 新特性 - 使用 Popover API 创建弹窗
    ThreadLocal详解
    Spring中最常用的11个扩展点
    【JAVASE】日期时间类
  • 原文地址:https://blog.csdn.net/qilei2010/article/details/126509172