Multithreading 不能';t将事件从PyQt 4.6.3中的主线程发布到QThread

Multithreading 不能';t将事件从PyQt 4.6.3中的主线程发布到QThread,multithreading,pyqt,qthread,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

我试图用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(myObjlivingThread,myCustomEvent)
),但该代码也不起作用

我还尝试在PyQt4.8.3上运行这段代码,效果很好

是虫子吗?我的代码正确吗

另外,抱歉,真实版本:

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

PyQt从未有过4.6.3版-上一个次要版本是4.6.2。为了让其他人测试这一点,请说明使用的qt、python、pyqt和sip的版本,以及平台。我可以确认脚本在Python2.7.5、qt 4.8.5、sip 4.15.3、pyqt 4.10.3中的工作情况与预期一致;但Python2.4.6、Qt4.8.5、SIP4.10和PyQt4.7中没有。所以它似乎是PyQt 4.7和/或sip 4.10中的bug。哇,我发现了一个bug!我应该向开发人员报告这个bug吗?我认为sip/pyqt往往需要升级到最新版本才能得到bug修复(也就是说,它们通常不会被移植到早期版本),所以可能不值得报告。