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)