PyQt:从回调中更新GUI

Her*_*nan 5 python user-interface multithreading pyqt4

使用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()
Run Code Online (Sandbox Code Playgroud)

这工作正常(即文本更新在小部件中正确显示).然而,当我更换QLineEdit的通过的QTextEdit并使用追加方法添加文本,我得到:

QObject :: connect:无法对"QTextCursor"类型的参数进行排队

(确保使用qRegisterMetaType()注册'QTextCursor'.)

它仍然有效,但指出我做错了什么,而且我不确定当更多线程处于活动状态时我会继续工作.通常,我使用信号和插槽进行此类更新,但run函数不是PyQt特定的.问题是:

  1. 为什么没有QLineEdit的警告而不是QTextEdit的警告?
  2. 处理这种情况的正确方法是什么?

Eri*_*ser 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)
Run Code Online (Sandbox Code Playgroud)

  • [这个问题](http://stackoverflow.com/q/1595649/984421)是Python vs Qt线程问题的一个很好的起点.执行摘要:在与Qt交互时总是使用Qt线程; 否则,使用Python线程. (3认同)