Qthread から起動した Gui インターフェイスに戻るシグナリングを使用する方法を理解しようとしています。
セットアップ: ほぼ無期限に (または少なくとも非常に長い時間) 実行する必要があるプロセス (シミュレーション) があります。実行中にさまざまな計算を実行し、結果の一部をそれらをリアルタイムで適切に表示するGUI。GUIにPyQtを使用しています。私はもともとpythonのスレッドモジュールを使用してみましたが、ここSOと他の場所の両方でいくつかの投稿を読んだ後、QThreadsに切り替えました。
Qt Blog You're doing it wrongのこの投稿によると、QThread の推奨される使用方法は、QObject を作成してから Qthread に移動することです。だから私は PyQt の QThread を使用したバックグラウンド スレッドのアドバイスに従いました"> この SO の質問と簡単なテスト アプリ (以下のコード) を試しました: シンプルな GUI を開き、バックグラウンド プロセスを開始させ、ステップ値を更新することになっていますスピンボックス。
しかし、うまくいきません。GUI は更新されません。私は何を間違っていますか?
import time, sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class SimulRunner(QObject):
'Object managing the simulation'
stepIncreased = pyqtSignal(int, name = 'stepIncreased')
def __init__(self):
super(SimulRunner, self).__init__()
self._step = 0
self._isRunning = True
self._maxSteps = 20
def longRunning(self):
while self._step < self._maxSteps and self._isRunning == True:
self._step += 1
self.stepIncreased.emit(self._step)
time.sleep(0.1)
def stop(self):
self._isRunning = False
class SimulationUi(QDialog):
'PyQt interface'
def __init__(self):
super(SimulationUi, self).__init__()
self.goButton = QPushButton('Go')
self.stopButton = QPushButton('Stop')
self.currentStep = QSpinBox()
self.layout = QHBoxLayout()
self.layout.addWidget(self.goButton)
self.layout.addWidget(self.stopButton)
self.layout.addWidget(self.currentStep)
self.setLayout(self.layout)
self.simulRunner = SimulRunner()
self.simulThread = QThread()
self.simulRunner.moveToThread(self.simulThread)
self.simulRunner.stepIncreased.connect(self.currentStep.setValue)
self.connect(self.stopButton, SIGNAL('clicked()'), self.simulRunner.stop)
self.connect(self.goButton, SIGNAL('clicked()'), self.simulThread.start)
self.connect(self.simulRunner,SIGNAL('stepIncreased'), self.currentStep.setValue)
if __name__ == '__main__':
app = QApplication(sys.argv)
simul = SimulationUi()
simul.show()
sys.exit(app.exec_())