gpt4 book ai didi

python - 如何从正在运行的 QThread 向启动它的 PyQt Gui 发出信号?

转载 作者:太空狗 更新时间:2023-10-29 21:43:42 35 4
gpt4 key购买 nike

我正在尝试了解如何使用从 Qthread 发回启动的 Gui 界面的信号。

设置:我有一个过程(模拟)需要几乎无限期地运行(或至少运行很长一段时间)。在运行时,它会执行各种计算,并且必须发送一些结果返回到 GUI,它将实时适本地显示它们。我在 GUI 中使用 PyQt。我最初尝试使用 python 的线程模块,然后在阅读了 SO 和其他地方的几篇文章后切换到 QThreads。

根据 Qt 博客上的这篇文章 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_())

最佳答案

这里的问题很简单:您的 SimulRunner 从未收到导致其开始工作的信号。一种方法是将它连接到线程的 started 信号。

此外,在 python 中,您应该使用新式的信号连接方式:

...
self.simulRunner = SimulRunner()
self.simulThread = QThread()
self.simulRunner.moveToThread(self.simulThread)
self.simulRunner.stepIncreased.connect(self.currentStep.setValue)
self.stopButton.clicked.connect(self.simulRunner.stop)
self.goButton.clicked.connect(self.simulThread.start)
# start the execution loop with the thread:
self.simulThread.started.connect(self.simulRunner.longRunning)
...

关于python - 如何从正在运行的 QThread 向启动它的 PyQt Gui 发出信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16241297/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com