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

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

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

1 场景

如下:

  • 主窗口 win 弹出个对话框 dlg。
  • 在对话框 dlg 中,用户输入 姓名,年龄,然后点击保存,对话框将用户输入的数据传递给 主窗口 win。
  • 主窗口收到 对话框的数据后,关闭对话框。

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

代码

声明:代码环境为: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. 发射信号

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

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...