我有以下代码:
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'}))。我必须错过一个非常简单但基本的机制,但我无法弄清楚。
提前致谢!
答案 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_()