QThread更新UI状态栏?

pan*_*ish 2 python qt multithreading pyqt qthread

我有一个简单的pyqt gui,它创建一个qthread来打开文件并读取一些信息.我想更新我gui的状态栏.通常,这将是我在状态栏上更新消息的函数调用:

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

但是,更新线程内状态的调用不起作用.如何在qthread中更新gui的状态栏?

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

ekh*_*oro 5

您绝不能尝试从GUI线程外部更新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)
Run Code Online (Sandbox Code Playgroud)