使用Python3和PyQt4我有一个函数(运行),它将一个可调用的输入作为输入来提供状态更新。
class Windows(QtGui.QWidget):
# Creates a widget containing:
# - a QLineEdit (status_widget)
# - a button, connected to on_run_clicked
def on_run_clicked(self):
def update(text):
self.widget.setText(text)
threading.Thread(target=run, args=(update, )).start()
这样可以正常工作(即文本更新在窗口小部件中正确显示)。但是,当我用 QTextEdit 替换 QLineEdit 并使用追加方法添加文字时,我得到:
QObject :: connect:无法对“QTextCursor”类型的参数进行排队
(确保使用qRegisterMetaType()注册'QTextCursor'。)
它仍然有效,但指出我做错了什么,而且我不确定当更多线程处于活动状态时我会继续工作。通常,我使用信号和插槽进行此类更新,但 run 函数不是特定于PyQt的。问题是:
答案 0 :(得分:10)
我不知道一个类工作的具体原因而另一个没有 - 我也不知道使用Python线程与Qt的线程之间的区别...但是,我可以告诉你它是非常的如果你没有正确设置,那就是温和的。也就是说,您不能(或者至少不应该)从线程修改GUI对象。再一次,不确定python与Qt线程的区别。但是,从GUI修改界面的安全方法是向窗口发送信号......我知道这样做的最简单方法是通过Qt线程。
class MyThread(QtCore.QThread):
updated = QtCore.pyqtSignal(str)
def run( self ):
# do some functionality
for i in range(10000):
self.updated.emit(str(i))
class Windows(QtGui.QWidget):
def __init__( self, parent = None ):
super(Windows, self).__init__(parent)
self._thread = MyThread(self)
self._thread.updated.connect(self.updateText)
# create a line edit and a button
self._button.clicked.connect(self._thread.start)
def updateText( self, text ):
self.widget.setText(text)