2017-08-13 78 views
1

嗨,我已发送到我的主题工作人员链接到GUI并直接从QThread更新GUI信息。喜欢这里:直接从Qthread更改GUI PyQt 5

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的新手。谢谢。如果我的解决方案不好,请帮我修复它。

+1

您不应该在主线程以外的其他线程中更新GUI,您必须使用信号和插槽将信息从辅助线程发送到主线程。 – eyllanesc

+0

什么是info类型? – eyllanesc

+0

我可以通过信号发送任何信息,例如通过执行线程收到的字典列表吗? – Hellbea

回答

2

你不能,不能更新从辅助线程的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") 

GUI:

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

Thx解决我们正在使用'def onDataFromThread'? – Hellbea

+0

在这个函数中,您将收到词典列表,也就是说,每次发送发送函数将被调用的词典列表的信号时,您都必须更新ui.tableWidget。 – eyllanesc

+0

回答inow的大thx我明白信号槽如何工作。我已标记 – Hellbea