我试图从主线程发出信号,用PyQt 4.6.3分离线程。但似乎事件无法从主线程发布,没有任何反应。 这是我的代码,演示了这个问题。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Unexpected behavior of QThread event loop
import sys
from PyQt4 import QtCore, QtGui
class MyObject(QtCore.QObject):
answer = QtCore.pyqtSignal()
@QtCore.pyqtSlot()
def onRequest(self):
print 'ping'
self.answer.emit()
class MyButton(QtGui.QPushButton):
answer = QtCore.pyqtSignal()
@QtCore.pyqtSlot()
def onRequest(self):
print 'pong'
# self.clicked.emit(True) # works fine in Qt 4.6.3
self.answer.emit() # doesn't work in Qt 4.6.3
def main():
a = QtGui.QApplication(sys.argv)
t = QtCore.QThread()
t.start()
obj = MyObject()
button = MyButton()
button.show()
button.clicked.connect(obj.onRequest)
button.answer.connect(obj.onRequest)
obj.answer.connect(button.onRequest)
obj.moveToThread(t)
sys.exit(a.exec_())
if __name__ == '__main__':
main()
我期待无限的“ping”和“pong”消息,但我只看到一个“ping” - “pong”消息对。
我还尝试编写将事件发布到QObject的代码,这些代码位于单独的线程(QCoreApplication.postEvent(myObjLivingInThread, myCustomEvent)
)中,并且该代码也不起作用。
我也尝试在PyQt 4.8.3上运行此代码,它运行正常。
这是一个错误吗?我的代码是否正确?
P.S。对不起,真实版本: