title: How to stop a QThread from the GUI
body: <p>This is a follow up question to  a previous one  I posted earlier.
  The problem is how to stop (terminate|quit|exit) a QThread from the GUI when using the recommended method of NOT subclassing Qthread, but rather vreating a QObject and then moving it to a QThread. Below if a working example. I can start the GUI and the Qthread and I can have the latter update the GUI. However, I cannot stop it. I tried several methods for qthread (quit(), exit(), and even terminate())  to no avail.
  Help greatly appreciated.  </p>
  
  <p>Here is the complete code:</p>
  
  <pre><code>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  &lt; 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_())
  </code></pre>