QThread更新UI状态栏?

2 投票
1 回答
2223 浏览
提问于 2025-04-17 21:12

我有一个简单的pyqt图形界面,它会创建一个qthread来打开文件并读取一些信息。我想更新我界面上的状态栏。通常,我会用这个函数来更新状态栏上的消息:

class gui1(QtGui.QMainWindow):

    def __init__(self, parent=None):

        super(gui1, self).__init__(parent)
        self.statusBar().showMessage("hello world")
        ...
        # create thread here
        self.mythread = WorkThread(text)   # create instance and pass some text

        self.mythread.finished.connect(self.threadDone)   # signal emitted on finish of thread
        self.mythread.start()   # begin thread

但是,在这个线程里调用更新状态的函数并不奏效。我该如何在qthread中更新我的界面的状态栏呢?

class WorkThread(QtCore.QThread):

    def __init__(self,text):  
        self.text = text
        QtCore.QThread.__init__(self)

    def __del__(self):
        self.wait()        

    def run(self):
        self.ui.statusBar().showMessage(status)   # WRONG SELF

        return  # must return, so that Qthread finished signal is emitted

1 个回答

6

你绝对不能在GUI(图形用户界面)线程之外去更新界面。相反,你应该在工作线程中添加一个自定义信号,然后把这个信号连接到GUI中的一个槽(处理函数)上:

class WorkThread(QtCore.QThread):
    statusMessage = QtCore.pyqtSignal(object)       
    ...

    def run(self):
        self.statusMessage.emit(self.text)

class gui1(QtGui.QMainWindow):    
    def __init__(self, parent=None):    
        super(gui1, self).__init__(parent)
        self.mythread = WorkThread(text)
        ...
        self.mythread.statusMessage.connect(self.handleStatusMessage)

   @QtCore.pyqtSlot(object)
   def handleStatusMessage(self, message):
       self.ui.statusBar().showMessage(message)

撰写回答