Comment arrêter un QThread partir de l'interface graphique

C'est une question de suivi à un précédent j'ai posté plus tôt.
Le problème est de savoir comment stop (arrêter|quitter|quitter) un QThread partir de l'interface graphique lors de l'utilisation de la méthode recommandée de ne PAS sous-classement Qthread, mais plutôt vreating un QObject, puis en les déplaçant vers un QThread. Ci-dessous, si un exemple de travail. Je peux commencer le GUI et le Qthread et je peux avoir la dernière mise à jour de l'interface graphique. Cependant, je ne peux pas l'arrêter. J'ai essayé plusieurs méthodes pour qthread (quit(), exit(), et même de le terminer()) en vain.
Aider grandement apprécié.

Voici le code complet:

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.stopButton.clicked.connect(simulThread.qui)  # also tried exit() and terminate()
# also tried the following (didn't work)
# self.stopButton.clicked.connect(self.simulRunner.stop)
self.goButton.clicked.connect(self.simulThread.start)
self.simulThread.started.connect(self.simulRunner.longRunning)
self.simulRunner.stepIncreased.connect(self.current.step.setValue)
if __name__ == '__main__':
app = QApplication(sys.argv)
simul = SimulationUi()
simul.show()
sys.exit(app.exec_())
[qt-project.org/doc/qt-4.8/qthread.html#quit] vraiment devrait être la voie à suivre ici... essayer de nouveau, peut-être avec quelques rudimentaire de débogage autour de l'appel de la fonction?

OriginalL'auteur stefano | 2013-04-26