【发布时间】:2016-06-13 06:40:45
【问题描述】:
我已经实现了Qt Threading docs 中描述的工作者模式的一个版本。
我正在使用Signals/Slots 在工作线程和主线程之间发送数据。
在定义Signal 时,我将参数签名类型设置为object,因为我相信它应该允许我通过Signal 传递任何python 对象。
result_ready = QtCore.Signal(object)
但是,当我尝试通过 Signal 传递 None 时,python 会崩溃。这只发生在尝试跨线程传递Signal 时。如果我注释掉 self.worker.moveToThread(self.thread) 行,它可以工作并且 None 成功通过 Signal。
为什么在这种情况下我无法传递None?
我正在使用PySide 1.2.2 和Qt 4.8.5。
import sys
from PySide import QtCore, QtGui
class Worker(QtCore.QObject):
result_ready = QtCore.Signal(object)
@QtCore.Slot()
def work(self):
print 'In Worker'
# This works
self.result_ready.emit('Value')
# This causes python to crash
self.result_ready.emit(None)
class Main(QtGui.QWidget):
def __init__(self):
super(Main, self).__init__()
self.ui_lay = QtGui.QVBoxLayout()
self.setLayout(self.ui_lay)
self.ui_btn = QtGui.QPushButton('Test', self)
self.ui_lay.addWidget(self.ui_btn)
self.ui_lay.addStretch()
self.setGeometry(400, 400, 400, 400)
self.worker = Worker()
self.thread = QtCore.QThread(self)
self.worker.moveToThread(self.thread)
self.thread.start()
self.ui_btn.clicked.connect(self.worker.work)
self.worker.result_ready.connect(self.handle_worker_result)
@QtCore.Slot(object)
def handle_worker_result(self, result=None):
print 'Handling output', result
def closeEvent(self, event):
self.thread.quit()
self.thread.wait()
super(Main, self).closeEvent(event)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
obj = Main()
obj.show()
app.exec_()
【问题讨论】:
标签: python multithreading pyqt pyside signals-slots