【问题标题】:Is it possible to discover the sender of a signal using new style pyqtSignal?是否可以使用新型 pyqtSignal 发现信号的发送者?
【发布时间】:2013-05-05 20:15:07
【问题描述】:

以下面的代码为例,我想知道receiver()函数是否能够发现是w1还是w2向它发送了信号?

显然我知道我可以将此信息打包到信号中发送的消息中,但我想知道它是否可用而不这样做。据我所知,sender() 函数对接收者不可用。

import sys, time, random
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Worker(QThread):
    jobDone = pyqtSignal(str)

    def __init__(self):
        print 'new Worker'
        QThread.__init__(self)

    def run(self):
        time.sleep(2) # give time for event loop to start
        print 'thread working'
        time.sleep(random.randint(1,8))
        self.jobDone.emit('job done')

class Manager:
    def __init__(self):
        self.w1 = Worker()
        self.w1.jobDone.connect(self.receiver)

        self.w2 = Worker()
        self.w2.jobDone.connect(self.receiver)

        self.w1.start()
        self.w2.start()

    def receiver(self, msg):
        print msg

def main():
    app = QApplication(sys.argv)
    m = Manager()
    print 'before event loop'
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python multithreading qt pyqt


    【解决方案1】:

    sender() 方法适用于从QObject 派生的所有类,但您的Manager 类不是QObject 的子类。

    如果你想在你的类中使用sender(),只需让它继承自QObject

    【讨论】:

    • 好的,但是有没有一种等效的方法来识别不是从QObject派生的类的发件人?
    • 我刚刚尝试过,如果你在任何QObject 上调用sender() 方法,它似乎可以工作,我只是不确定这样做是否安全(特别是在多线程应用程序)。请参阅文档中的警告。
    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多