138.Python-PySide6:QPainter绘图制作时钟

QPainter类可以在窗体组件执行绘图操作,绘制操作在QWidget.paintEvent()中完成。绘制方法必须放在QtGui.QPainter对象的begin()和end()之间。

本文通过绘图制作时钟的实例来了解QPainter的具体使用。

先看效果

实现完整代码

import sysfrom PySide6 import QtCore, QtGui, QtWidgetsfrom math import *class MainWindow(QtWidgets.QWidget):    def __init__(self):        super().__init__()                self.setWindowTitle("Paint Clock")        #获取主屏幕大小        screen=QtGui.QGuiApplication.primaryScreen().geometry()        sw,sh=screen.width(),screen.height()        #设置窗口大小,屏幕居中        w,h=600,600 #窗口大小        self.setGeometry((sw-w)//2,(sh-h)//2,w,h) #窗口大小可调        #启动定时器        self.timer=QtCore.QTimer(self)        self.timer.timeout.connect(self.update) #每隔一秒更新一次,实现时钟功能        self.timer.start()                #设置时、分、秒针颜色和大小(这里以表盘半径为100来计算)        self.hourHand=QtGui.QPolygon([QtCore.QPoint(3, 7),QtCore.QPoint(-3, 7),QtCore.QPoint(-3, -60),QtCore.QPoint( 3, -60)])        self.minuteHand=QtGui.QPolygon([QtCore.QPoint(2, 7),QtCore.QPoint(-2, 7),QtCore.QPoint(-2, -70),QtCore.QPoint(2, -70)])        self.secondHand=QtGui.QPolygon([QtCore.QPoint(1, 15),QtCore.QPoint(-1, 15),QtCore.QPoint( -1, -85),QtCore.QPoint( 1, -85)])        self.hourColor=QtGui.QColor(255, 0, 0)        self.minuteColor=QtGui.QColor(0, 255, 0)        self.secondColor=QtGui.QColor(0, 0, 0)            def paintEvent(self, event):        painter = QtGui.QPainter(self)         painter.begin(self) #开始绘制        painter.setRenderHint(QtGui.QPainter.Antialiasing) #抗锯齿        painter.translate(self.width() / 2, self.height() / 2) #将坐标系移动到窗口中心        xy=200 #设置缩放后宽度,原点在窗口中心        painter.scale(self.width()/xy, self.height()/xy) #缩放坐标系,使得控件大小与窗口大小相同                #表盘记刻度        r=xy/2*0.8 #表盘内环半径        r0=r+17 #表盘外环半径        painter.setPen(QtGui.QPen(QtGui.QColor(0, 0, 0), 2, QtCore.Qt.SolidLine))        for i in range(60):            if i%5==0:                if i%15==0:                    painter.drawLine(r, 0, r0, 0) #                else:                    painter.drawLine(r+7, 0, r0,0)            else:                painter.drawLine(r+12, 0, r0, 0)                            painter.rotate(6) #旋转6度                #实时显示时间          strtime=QtCore.QTime.currentTime().toString("hh:mm:ss") #获取当前时间        painter.setPen(QtGui.QColor(0, 0, 255))        painter.drawText(-25,-50,strtime)                 #绘制文字        painter.setPen(QtGui.QColor(0, 0, 0))        painter.setFont(QtGui.QFont("Simple", 10))                for i in range(12):            #计算文字的坐标            num=i+3            if num>12:                num=num-12            x=r*cos(pi*i/6)-5            y=r*sin(pi*i/6)            painter.drawText(int(x),int(y), str(num))        #画指针        def drawPointer(color,rotation,pointer):            #painter.setPen(QtGui.Qt.NoPen)            painter.setBrush(QtGui.QBrush(color))            painter.rotate(rotation)            painter.drawConvexPolygon(pointer)                drawPointer(self.hourColor,30 * (self.hour() + self.minute() / 60.0),self.hourHand)        drawPointer(self.minuteColor,6 * (self.minute() + self.second() / 60.0),self.minuteHand)        drawPointer(self.secondColor,6 * (self.second() + self.msec() / 1000.0),self.secondHand)        painter.end() #结束绘图            def hour(self):        return QtCore.QTime.currentTime().hour()    def minute(self):        return QtCore.QTime.currentTime().minute()    def second(self):        return QtCore.QTime.currentTime().second()    def msec(self):        return QtCore.QTime.currentTime().msec()            if __name__ == '__main__':    app=QtWidgets.QApplication(sys.argv)    mywindow=MainWindow()    mywindow.show()    sys.exit(app.exec())


全屏

窗口

注意要点:

  • 1、要清楚坐标系变换和缩放后的坐标计算。
  • 2、绘图的开始和结束
  • 3、定时器的使用

通过本文实例,可以了解PySide6的绘图基本操作。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章