0

我有以下代码:

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)

但是,回调(参数)永远不会被调用,因为我没有看到控制台上打印的“回调中”。有人能帮忙吗?我尝试了代码的不同变体(例如,从 test_signal 中删除参数,连接到 self.fallback(),不包括 self.emit 中的任何参数(即删除 {'a': 'b'}))。我一定错过了一个非常简单但基本的机制,但我就是想不通。

提前致谢!

4

2 回答 2

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)
于 2014-01-22T21:22:31.903 回答
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_()
于 2014-01-22T21:27:59.353 回答