PyQt實現鐘錶效果

pythontab發表於2013-07-03

注意:本程式在Python3.3+PyQt5測試透過

主要目的是為了鍛鍊使用Qt繪圖的相關知識

'''
Created on 2013-7-2
@author: badboy
Email:lucky.haiyu@gmail.com
QQ:43831266
'''
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
 
class clockForm(QWidget):
    def __init__(self,parent=None):
        super(clockForm,self).__init__(parent)
        self.setWindowTitle("Clock")
        self.timer=QTimer()
        #設定視窗計時器
        self.timer.timeout.connect(self.update)
        self.timer.start(1000)
         
    def paintEvent(self,event):
        painter=QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
         
        #設定錶盤中的文字字型
        font=QFont("Times",6)
        fm=QFontMetrics(font)
        fontRect=fm.boundingRect("99")#獲取繪製字型的矩形範圍
         
        #分針座標點
        minPoints=[QPointF(50,25),
                   QPointF(48,50),
                   QPointF(52,50)]
         
        #時鐘座標點
        hourPoints=[QPointF(50,35),
                   QPointF(48,50),
                   QPointF(52,50)]
         
        side=min(self.width(),self.height())
        painter.setViewport((self.width()-side)/2,(self.height()-side)/2,
                            side,side)#始終處於視窗中心位置顯示
         
         
        #設定QPainter的座標系統,無論窗體大小如何變化,
        #窗體左上座標為(0,0),右下座標為(100,100),
        #因此窗體中心座標為(50,50)
        painter.setWindow(0,0,100,100)
         
        #繪製錶盤,使用環形漸變色
        niceBlue=QColor(150,150,200)
        haloGrident=QRadialGradient(50,50,50,50,50)
        haloGrident.setColorAt(0.0,Qt.lightGray)
        haloGrident.setColorAt(0.5,Qt.darkGray)
        haloGrident.setColorAt(0.9,Qt.white)
        haloGrident.setColorAt(1.0,niceBlue)
        painter.setBrush(haloGrident)
        painter.setPen(QPen(Qt.darkGray,1))
        painter.drawEllipse(0,0,100,100)
         
         
        transform=QTransform()
         
        #繪製時鐘為0的字,以及刻度
        painter.setPen(QPen(Qt.black,1.5))
        fontRect.moveCenter(QPoint(50,10+fontRect.height()/2))
        painter.setFont(font)
        painter.drawLine(50,2,50,8)#
        painter.drawText(QRectF(fontRect),Qt.AlignHCenter|Qt.AlignTop,"0")
         
        for i in range(1,12):
            transform.translate(50, 50)
            transform.rotate(30)
            transform.translate(-50,-50)
            painter.setWorldTransform(transform)
            painter.drawLine(50,2,50,8)
            painter.drawText(QRectF(fontRect),Qt.AlignHCenter|Qt.AlignTop,"%d" % i)
         
        transform.reset()
         
        #繪製分鐘刻度線
        painter.setPen(QPen(Qt.blue,1))
        for i in range(1,60): 
            transform.translate(50,50)
            transform.rotate(6)
            transform.translate(-50,-50)
            if i%5!=0:
                painter.setWorldTransform(transform)
                painter.drawLine(50,2,50,5)
                 
                 
        transform.reset()
         
        #獲取當前時間
        currentTime=QTime().currentTime()
        hour=currentTime.hour() if currentTime.hour()<12 else currentTime.hour()-12
        minite=currentTime.minute()
        second=currentTime.second()
         
        #獲取所需旋轉角度
        hour_angle=hour*30.0+(minite/60.0)*30.0
        minite_angle=(minite/60.0)*360.0
        second_angle=second*6.0
         
        #時針
        transform.translate(50,50)
        transform.rotate(hour_angle)
        transform.translate(-50,-50)
        painter.setWorldTransform(transform)
        painter.setPen(Qt.NoPen)
        painter.setBrush(QBrush(Qt.darkRed))
        painter.drawPolygon(QPolygonF(hourPoints))
         
        transform.reset()
         
        #分針
        transform.translate(50,50)
        transform.rotate(minite_angle)
        transform.translate(-50,-50)
        painter.setWorldTransform(transform)
        painter.setBrush(QBrush(Qt.darkGreen))
        painter.drawPolygon(QPolygonF(minPoints))
         
        transform.reset()
        #秒針
        transform.translate(50,50)
        transform.rotate(second_angle)
        transform.translate(-50,-50)
        painter.setWorldTransform(transform)
        painter.setPen(QPen(Qt.darkCyan,1))
        painter.drawLine(50,50,50,20)   
 
if __name__=="__main__":
    import sys
    app=QApplication(sys.argv)
    form=clockForm()
    form.show()
    app.exec_()


相關文章