2017-08-13 221 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