直接从Qthread PyQt 5更改GUI

发布于 2021-01-29 18:34:11

嗨,我已经发送到GUI的线程工作程序链接,并直接从QThread更新GUI信息。像这儿:

class Worker(QThread):
  def __init__(self, ui):
    QThread.__init__(self)
    self.running = False
    self.ui = ui

  def run(self):
    self.running = True
    while self.running:
        info = self.check_info()
        rows = len(info)
        self.ui.tableWidget.setRowCount(rows)
        self.ui.tableWidget.setColumnCount(6) 
        ...

在主要QMainWindow我只是添加

def __init__(self, parent=None):
    .......
    self.myworker = Worker(self.ui)
    .....

这样的解决方案在PyQt5中非常不好吗?我是PyQt的新手。谢谢。如果我的解决方案不好,请帮助我修复它。

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您不能也不能从辅助线程更新GUI,必须通过信号和插槽来完成:

    为此pyqtSignal(),我们将通过class创建一个信号,并将指示参数的类型,然后将其连接到所需的插槽,如下所示:

    线:

    class Worker(QThread):
        list_of_dict_signals = pyqtSignal(list)
        str_signal = pyqtSignal(str)
        def __init__(self,  parent=None):
            QThread.__init__(self, parent)
            self.running = False
    
        def run(self):
            self.running = True
            while self.running:
                info = self.check_info()
                self.list_of_dict_signals.emit(info)
                self.str_signal.emit("Requesting info")
    

    界面:

    def __init__(self, parent=None):
        .......
        self.myworker = Worker(self)
        self.myworker.list_of_dict_signals.connect(self.onDataFromThread)
        self.myworker.str_signal.connect(self.ui.statusbar.showMessage)
        self.myworker.start()
    
    def onDataFromThread(self, info):
        rows = len(info)
        self.ui.tableWidget.setRowCount(rows)
        ...
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看