如何从运行中信号的QThread回PyQt的图形用户界面,开始了吗?(How to signal f

2019-09-01 05:45发布

我想了解如何使用信号从QThread的回到开始的GUI界面。

设置:我有一个需要几乎无限期地运行(或至少的时间很长一段)的过程(模拟),虽然它运行时,它进行各种运算,AMD的一些结果必须发送回。图形用户界面,这将实时适当地显示它们。 我使用的PyQt的图形用户界面。 我最初试图使用python的线程模块,然后读取多个职位都在这里SO和其他地方后,切换到QThreads。

根据这个职位上Qt的博客你就错了 ,使用QThread的首选方法是通过创建一个QObject,然后将其移动到的QThread。 所以我也跟着用的QThread在PyQt的意见inBackground线“>这太问题,并试图一个简单的测试应用程序(代码如下):它开辟了一个简单的图形用户界面,让您启动后台进程,它issupposed更新步长值一个纺纱器。

但是,这是行不通的。 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_())

Answer 1:

这里的问题很简单:你的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)
...


文章来源: How to signal from a running QThread back to the PyQt Gui that started it?