PyQt實現鐘表效果
注意:本程序在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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!