PyQt:从callb更新GUI

2024-04-20 13:23:27 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python3和PyQt4,我有一个函数(run),它接受一个可调用的输入,以提供状态更新。

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并使用append方法添加文本时,我得到:

QObject::connect: Cannot queue arguments of type 'QTextCursor'

(Make sure 'QTextCursor' is registered using qRegisterMetaType().)

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

  1. 为什么它在没有QLineEdit警告的情况下工作,而不是 Q文本编辑?
  2. 处理这种情况的正确方法是什么?

Tags: 方法函数runtext文本selfondef
1条回答
网友
1楼 · 发布于 2024-04-20 13:23:27

我不知道为什么一个类工作而另一个不工作——我也不知道使用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)

相关问题 更多 >