A QMainWindow and a QThread exchange signals.
#!/usr/bin/env python # # A QMainWindow uses a QThread to do some work # import sys from PyQt4 import QtGui, QtCore class WorkerThread(QtCore.QThread): def __init__(self): QtCore.QThread.__init__(self) def slotWork(self, i): i = i + 1 print( "worker.slotWork, emitting", i, ", finish at 5") self.emit(QtCore.SIGNAL('done(int)'), i) if i == 5: self.emit(QtCore.SIGNAL('bye')) def run(self): #print( 'Worker thread:', self.currentThread()) print( "Worker.run") self.exec_() def stop( self): self.exit() class MainWindow(QtGui.QMainWindow): def __init__(self): self.i = 1 QtGui.QMainWindow.__init__(self) #print( 'mainWindow.__init__:', self.thread()) self.prepare() self.connect(self.b1, QtCore.SIGNAL('clicked()'),self.slotClicked) self.connect(self.b2, QtCore.SIGNAL('clicked()'),self.slotClose) def prepare( self): vbox = QtGui.QVBoxLayout() self.b1 = QtGui.QPushButton('Do %i' % self.i) self.b2 = QtGui.QPushButton('Quit') vbox.addWidget( self.b1) vbox.addWidget( self.b2) w = QtGui.QWidget() w.setLayout(vbox) self.setCentralWidget( w) def slotClicked(self): self.emit(QtCore.SIGNAL('work(int)'), self.i) def slotDone(self, i): self.i = i self.b1.setText('Do %i' % self.i) def slotClose( self): self.close() self.emit(QtCore.SIGNAL('stop')) def main(args): app = QtGui.QApplication(sys.argv) mw = MainWindow() mw.show() worker = WorkerThread() app.connect(mw, QtCore.SIGNAL('work(int)'), worker.slotWork) app.connect(mw, QtCore.SIGNAL('stop'), worker.stop) app.connect(worker, QtCore.SIGNAL('done(int)'), mw.slotDone) app.connect(worker, QtCore.SIGNAL('bye'), mw.slotClose) #print( 'Main thread:', app.instance().thread()) worker.start() app.exec_() if __name__ == "__main__": main(sys.argv)