pyqt5多级信号传递解决办法

在编写pyqt程序时,经常用到Qt 多线程,而通常不在多线程的run()函数直接写逻辑函数,而是另外起一个类来写主逻辑,这时候如果逻辑函数类中需要传递信号到qt主函数,就是三级信号传递,这时候就不能简单的使用每个类中各自定义一个pySignal()来传递参数了,因为逻辑函数并不是主函数直接调用的,传递参数没有用,下面的办法可以解决:

在主函数调用QT多线程时,将多线程中定义好的信号传递给逻辑函数,这样逻辑函数也不需要继承任何类,直接使用多线程定义的信号发送消息即可。

网上查了好久都没有解决办法,最后自己试了一下,果然可以,其他网友如果有更好的办法,还请留言指导。

import sys

from PyQt5.QtCore import pyqtSignal, QThread, Qt
from PyQt5.QtWidgets import QDialog, QPushButton, QHBoxLayout, QApplication


# 实际执行的程序
class AA():
    # test_signal = pyqtSignal(str, list)
    def __init__(self, signal_trig):
        self.test_signal = signal_trig
        self.hello()

    # 写逻辑函数
    def hello(self):
        self.test_signal.emit('我是AA类', list(range(10)))


# 多线程函数
class My_thread(QThread):
    bb_signal = pyqtSignal(str, list)
    def __init__(self):
        super(My_thread, self).__init__()

    def run(self):
        a = AA(self.bb_signal)

    def word(self, ss, lst):
        print(ss, lst)
        # self.bb_signal.emit(ss, lst)


# 主界面程序
class CC(QDialog):
    def __init__(self):
        super(CC, self).__init__()
        self.initUi()


    def initUi(self):
        btn = QPushButton('单击接收信号')
        self.resize(300, 300)
        hLayout = QHBoxLayout()
        hLayout.addWidget(btn)
        self.setLayout(hLayout)

        btn.clicked.connect(self.btn_click)

    def btn_click(self):
        self.t = My_thread()
        self.t.bb_signal.connect(self.cc_print)
        self.t.start()


    def cc_print(self, ss, lst):
        print(ss, lst)



if __name__ == '__main__':
    # PyQt5高清屏幕自适应设置,以及让添加的高清图标显示清晰,不然designer导入的图标在程序加载时会特别模糊
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
    app = QApplication(sys.argv)
    main_win = CC()

    main_win.show()
    sys.exit(app.exec_())

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值