我已經實現了Qt Threading docs中描述的工作模式版本。如何向線程發送無信號?
我使用Signals/Slots
在工作線程和主線程之間發送數據。
當定義Signal
時,我將參數簽名類型設置爲object
,因爲我相信它應該允許我通過Signal
傳遞任何python對象。
result_ready = QtCore.Signal(object)
然而,當我試圖通過Signal
通過None
崩潰蟒蛇。只有在嘗試跨線程傳遞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_()
是的,但如果使用OP實際嘗試發出的對象的類型(即'type(None)'),它將不起作用。 – ekhumoro
同意..這只是一個解決方法 – Achayan