一、问题描述
当在一个窗口中添加了 QTextEdit/QTextBrowser 控件,并在一个工作者线程中直接调用了 QTextEdit/QTextBrowser 的append函数,这个时候就会出现下面的错误:
QObject::connect: Cannot queue arguments of type ‘QTextCursor’
(Make sure ‘QTextCursor’ is registered using qRegisterMetaType().)
二、问题分析
我们不能通过线程来修改UI,较为安全的修改用户界面的方式是向UI窗口发送信号(signal)
三、解决方案
在工作线程中发射信号,来驱动文本的更新,以下是简要的示例代码
class MyThread(QtCore.QThread):
# 定义一个信号
updated_text = QtCore.pyqtSignal(str)
def run( self ):
# do some work here
self.updated_text.emit('job finished')
class Windows(QtGui.QWidget):
def __init__( self, parent = None ):
super(Windows, self).__init__(parent)
self._thread = MyThread(self)
# 关联工作线程中的信号到此处的槽函数updateText,在updateText中完成ui的更新
self._thread.updated_text.connect(self.updateText)
# 点击按钮,开始执行任务
self._button.clicked.connect(self._thread.start)
def updateText( self, text ):
# 这里对UI进行更新
self.widget_ui.text_browser.append(text)