PyQt實現鐘表效果

nf456 9年前發布 | 44K 次閱讀 PyQt GUI開發框架

注意:本程序在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_()</pre>

 本文由用戶 nf456 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!