QMainWindow and QThread exchange signals

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)