#!/usr/bin/env python ############################################################################# ## ## Copyright (C) 2004-2005 Trolltech AS. All rights reserved. ## ## This file is part of the example classes of the Qt Toolkit. ## ## This file may be used under the terms of the GNU General Public ## License version 2.0 as published by the Free Software Foundation ## and appearing in the file LICENSE.GPL included in the packaging of ## this file. Please review the following information to ensure GNU ## General Public Licensing requirements will be met: ## http://www.trolltech.com/products/qt/opensource.html ## ## If you are unsure which license is appropriate for your use, please ## review the following information: ## http://www.trolltech.com/products/qt/licensing.html or contact the ## sales department at sales@trolltech.com. ## ## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ## ############################################################################# import sys from PyQt4 import QtCore, QtGui class PyAnalogClock(QtGui.QWidget): """PyAnalogClock(QtGui.QWidget) Provides an analog clock custom widget with signals, slots and properties. The implementation is based on the Analog Clock example provided with both Qt and PyQt. """ # We use this special class variable to define two signals that are used # to inform other components of changes to the clock's time and time zone. # Signals that are declared in this way are emitted in the same way as any # other signal. __pyqtSignals__ = ("timeChanged(QTime)", "timeZoneChanged(int)") def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.timeZoneOffset = 0 timer = QtCore.QTimer(self) self.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("update()")) self.connect(timer, QtCore.SIGNAL("timeout()"), self.updateTime) timer.start(1000) self.setWindowTitle(QtCore.QObject.tr(self, "Analog Clock")) self.resize(200, 200) self.hourHand = QtGui.QPolygon([ QtCore.QPoint(7, 8), QtCore.QPoint(-7, 8), QtCore.QPoint(0, -40) ]) self.minuteHand = QtGui.QPolygon([ QtCore.QPoint(7, 8), QtCore.QPoint(-7, 8), QtCore.QPoint(0, -70) ]) self.hourColor = QtGui.QColor(0, 127, 0) self.minuteColor = QtGui.QColor(0, 127, 127, 191) def paintEvent(self, event): side = min(self.width(), self.height()) time = QtCore.QTime.currentTime() time = time.addSecs(self.timeZoneOffset * 3600) painter = QtGui.QPainter() painter.begin(self) painter.setRenderHint(QtGui.QPainter.Antialiasing) painter.translate(self.width() / 2, self.height() / 2) painter.scale(side / 200.0, side / 200.0) painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtGui.QBrush(self.hourColor)) painter.save() painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))) painter.drawConvexPolygon(self.hourHand) painter.restore() painter.setPen(self.hourColor) for i in range(0, 12): painter.drawLine(88, 0, 96, 0) painter.rotate(30.0) painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtGui.QBrush(self.minuteColor)) painter.save() painter.rotate(6.0 * (time.minute() + time.second() / 60.0)) painter.drawConvexPolygon(self.minuteHand) painter.restore() painter.setPen(QtGui.QPen(self.minuteColor)) for j in range(0, 60): if (j % 5) != 0: painter.drawLine(92, 0, 96, 0) painter.rotate(6.0) painter.end() def minimumSizeHint(self): return QtCore.QSize(50, 50) def sizeHint(self): return QtCore.QSize(100, 100) def updateTime(self): self.emit(QtCore.SIGNAL("timeChanged(QTime)"), QtCore.QTime.currentTime()) # The timeZone property is implemented using the getTimeZone() getter # method, the setTimeZone() setter method, and the resetTimeZone() method. # The getter just returns the internal time zone value. def getTimeZone(self): return self.timeZoneOffset # The setTimeZone() method is also defined to be a slot. The @pyqtSignature # decorator is used to tell PyQt which argument type the method expects, # and is especially useful when you want to define slots with the same # name that accept different argument types. @QtCore.pyqtSignature("setTimeZone(int)") def setTimeZone(self, value): self.timeZoneOffset = value self.emit(QtCore.SIGNAL("timeZoneChanged(int)"), value) self.update() # Qt's property system supports properties that can be reset to their # original values. This method enables the timeZone property to be reset. def resetTimeZone(self): self.timeZoneOffset = 0 self.emit(QtCore.SIGNAL("timeZoneChanged(int)"), 0) self.update() # Qt-style properties are defined differently to Python's properties. # To declare a property, we call pyqtProperty() to specify the type and, # in this case, getter, setter and resetter methods. timeZone = QtCore.pyqtProperty("int", getTimeZone, setTimeZone, resetTimeZone) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) clock = PyAnalogClock() clock.show() sys.exit(app.exec_())