= A full widget waiting indicator = In [[http://lists.trolltech.com/pipermail/qt-interest/2009-September/012678.html|this message]] on the [[http://lists.trolltech.com/mailman/listinfo/qt-interest|qt-interest mailing list]], Fabio Dago asked how to create a "waiting widget". This example is adapted from the [[http://wiki.qtcentre.org/index.php?title=Widget_Overlay|Widget Overlay]] example on the [[http://wiki.qtcentre.org|Qt Centre Wiki]], adding timer code to animate the indicator. {{attachment:wait.png}} {{{ #!python import math, sys from PyQt4.QtCore import Qt, QTimer from PyQt4.QtGui import * class Overlay(QWidget): def __init__(self, parent = None): QWidget.__init__(self, parent) palette = QPalette(self.palette()) palette.setColor(palette.Background, Qt.transparent) self.setPalette(palette) def paintEvent(self, event): painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) painter.fillRect(event.rect(), QBrush(QColor(255, 255, 255, 127))) painter.setPen(QPen(Qt.NoPen)) for i in range(6): if (self.counter / 5) % 6 == i: painter.setBrush(QBrush(QColor(127 + (self.counter % 5)*32, 127, 127))) else: painter.setBrush(QBrush(QColor(127, 127, 127))) painter.drawEllipse( self.width()/2 + 30 * math.cos(2 * math.pi * i / 6.0) - 10, self.height()/2 + 30 * math.sin(2 * math.pi * i / 6.0) - 10, 20, 20) painter.end() def showEvent(self, event): self.timer = self.startTimer(50) self.counter = 0 def timerEvent(self, event): self.counter += 1 self.update() if self.counter == 60: self.killTimer(self.timer) self.hide() class MainWindow(QMainWindow): def __init__(self, parent = None): QMainWindow.__init__(self, parent) widget = QWidget(self) self.editor = QTextEdit() self.editor.setPlainText("0123456789"*100) layout = QGridLayout(widget) layout.addWidget(self.editor, 0, 0, 1, 3) button = QPushButton("Wait") layout.addWidget(button, 1, 1, 1, 1) self.setCentralWidget(widget) self.overlay = Overlay(self.centralWidget()) self.overlay.hide() button.clicked.connect(self.overlay.show) def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept() if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) }}}