【问题标题】:Changing GUI directly from Qthread PyQt 5直接从 Qthread PyQt 5 更改 GUI
【发布时间】:2018-01-21 18:38:42
【问题描述】:

您好,我已向我的 Thread worker 发送 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 的新手。谢谢。如果我的解决方案不好,请帮助我解决它。

【问题讨论】:

  • 你不应该在主线程以外的其他线程更新GUI,你必须使用信号和槽将信息从辅助线程发送到主线程。
  • info 的类型是什么?
  • 我可以通过信号发送任何信息,例如我通过执行线程收到的字典列表吗?
  • info 是字典列表
  • 是的,如果可以的话,但是您需要特定的语法。为什么需要在另一个线程中运行 check_info?

标签: python python-3.x pyqt pyqt5 qthread


【解决方案1】:

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

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

线程:

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)
    ...

【讨论】:

  • 感谢解决我们正在使用的问题def onDataFromThread?
  • 在这个函数中你会收到字典列表,也就是说,每次你发送发送字典列表的信号时,该函数将被调用,你必须更新 ui.tableWidget .
  • 非常感谢我现在了解信号​​槽的工作原理。我已标记
  • 我建议你研究信号、槽和事件。这些是 Qt 的原始部分,因此也是 PyQt 的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2021-07-28
  • 1970-01-01
  • 2019-07-30
  • 2018-10-10
相关资源
最近更新 更多