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

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

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

1 场景

如下:

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

该场景是单向的 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. 发射信号

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

你可能感兴趣的:(PyQt,pyqt,pycharm)