2017-08-13 8 views
1

こんにちは、私はスレッドワーカーのGUIへのリンクを送信し、QThreadから直接GUI情報を更新しています。ここのように:私はちょうどQthread PyQt 5から直接GUIを変更する

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

を追加し、メインQMainWindow

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

はPyQt5で非常に悪いようなソリューションですか?私はPyQtの新機能です。どうも。私の解決策が悪い場合はplz私はそれを修正するために助けてください。

+1

メインスレッド以外の別のスレッドでGUIを更新しないでください。信号とスロットを使用してセカンダリスレッドからメインスレッドに情報を送信する必要があります。 – eyllanesc

+0

'info'のタイプは? – eyllanesc

+0

スレッドを実行して受け取ったdictsのリストなど、シグナルを使って情報を送信できますか? – 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

'def onDataFromThread'を使用しているもののためのThx? – Hellbea

+0

この関数では、辞書のリストを受け取ります。つまり、関数が呼び出される辞書のリストを送るシグナルを送るたびに、ui.tableWidgetを更新する必要があります。 – eyllanesc

+0

答えのための大きいthx私はシグナルスロットの仕組みを理解する。私は – Hellbea

関連する問題