Python QT发出SIGNAL没有调用回调函数

时间:2014-01-22 20:52:01

标签: python qt pyqt qthread emit

我有以下代码:

def callback(param):
    print "in callback"

class Test(QThread):
    def __init__(self):
        QThread.__init__(self)
        #QObject.connect(self, SIGNAL("test_signal(PyQt_PyObject)"), callback)
        print "Test constructed"

    def fallback(self, dummy=None):
        print "in fallback"

    def run(self):
        while 1:
            print "Test running"
            self.emit(SIGNAL("test_signal(PyQt_PyObject)"), {'a': 'b'})
            time.sleep(1)

t = None

if __name__ == "__main__":

    t = Test()
    t.start()
    QObject.connect(t, SIGNAL("test_signal(PyQt_PyObject)"), callback)
    while True:
        time.sleep(2)

然而,回调(param)永远不会被调用,因为我没有看到"在回调"打印在控制台上。有人能帮忙吗?我尝试了不同的代码变体(例如从test_signal中删除参数,连接到self.fallback(),不包括self.emit中的任何参数(即删除{' a':&# 39; b'}))。我必须错过一个非常简单但基本的机制,但我无法弄清楚。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您必须申报自定义信号。这是一个与pyqt非常相似的PySide示例,但您可能需要对其进行修改。它还取决于版本。这是带有PySide 1.2.1的Python 3.3版本

class Test(QThread):
    test_signal = QtCore.Signal(object)

...
    while 1:
        print "Test running"
        self.test_signal.emit({"a": "b"})

...
t.test_signal.connect(callback)

答案 1 :(得分:2)

如果您希望线程使用需要启动事件循环的信号,则更直接的方法是启动QApplication

from PyQt4.QtGui import QApplication
from PyQt4.QtCore import *
import time

@pyqtSlot(dict)
def callback(param):
    print "in callback"
    print param

class Test(QThread):

    mySignal =  pyqtSignal(dict,name="mySignal")

    def __init__(self):
        QThread.__init__(self)

    def run(self):
        while 1:
            print "Test running"
            self.mySignal.emit({'a': 'b'})
            time.sleep(1)

if __name__ == "__main__":
    t = Test()
    t.start()
    t.mySignal.connect(callback)
    app = QApplication([])
    app.exec_()