无法在PyQt 4.6.3中从主线程向QThread发布事件

时间:2013-11-12 13:41:53

标签: multithreading pyqt qthread

我试图从主线程发出信号,用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。对不起,真实版本:

  • PyQt 4.7
  • Qt 4.4.2
  • python 2.4.3
  • sip 4.10

0 个答案:

没有答案