源代码如下
此代码参考QT官方文档,完整代码如下:
from PySide6.QtWidgets import QApplication, QDialog
from PySide6.QtGui import QPainter, QPaintEvent, QColor, QPalette, QPen
from PySide6.QtCore import QTimer, QTime, Qt
import sys
class Dialog(QDialog):
def __init__(self):
super(Dialog, self).__init__()
self.resize(600, 600)
"""
QTimer定时器会定时发送timeout信号
可以: 通过QTimer.setInterval(msec)设置时间间隔(msec单位为毫秒)
之后通过QTimer.start()启动,
也可以用 QTimer.start(msec)一个函数完成时间设置和启动定时器的工作。
"""
timer = QTimer(self) # 新建定时器
timer.timeout.connect(self.update) # 重绘
timer.start(1000) # 定时器启动,每1000ms发送一次timeout事件
def paintEvent(self, event):
'''重载paintEvent函数,此函数负责窗体重绘。'''
p = QPainter(self)
'''
setRenderHint 用此函数设置抗锯齿效果,使图像更平滑
translate(x, y) 将坐标原点平移至x ,y(
PySide6坐标系统默认: 1. 左上角为原点,2. 水平x轴向右增加, 3.竖直y轴向下增加
scale(sx, sy) 将x,y轴分别拉伸至原来的sx,sy倍;
'''
p.setRenderHint(QPainter.RenderHint.Antialiasing)
p.translate(self.width() / 2, self.height() / 2) # 坐标原点平移至宿窗体中心
factor = min(self.width(), self.height()) / 200 # 缩放因子以短边确定,调至200
p.scale(factor, factor) # 拉伸
'''
本例用到的俩种颜色,从调色版中获取。你也可以自己指定颜色,如:
color1 = QColor(0,0,0)
color2 = QColor(255,0,0)
QColor(r,g,b)三个参数:r,g,b别表示红、绿、兰三种颜色,取值从0到255
'''
color1 = self.palette().color(QPalette.ColorRole.Text)
color2 = self.palette().color(QPalette.ColorRole.Accent)
for i in range(60):
"""绘制分钟刻度, rotate用来坐标系的旋转,单位为度。
画完后正好转一圈……"""
p.rotate(6.0)
p.drawLine(96, 0, 92, 0) # 短直线
p.setPen(color1)
p.setBrush(color1)
for i in range(12):
"""绘制时钟刻度"""
p.rotate(30.0)
p.drawRect(73, -3, 16, 6)
cur_time = QTime.currentTime() # 获取系统时间
hour = cur_time.hour() # 时
minute = cur_time.minute() # 分
second = cur_time.second() # 秒
"""绘制时、分、秒针,不再赘述"""
p.save()
p.rotate((hour + minute / 60) * 30)
p.drawRect(-5, -71, 10, 85)
p.restore()
p.save()
p.rotate(minute * 6)
p.drawRect(-4, -89, 8, 103)
p.restore()
p.save()
p.rotate(second * 6)
p.drawRect(-1, -89, 2, 103)
p.setPen(color2)
p.setBrush(color2)
p.drawEllipse(-3, -3, 6, 6)
p.drawEllipse(-5, -68, 10, 10)
p.restore()
if __name__ == "__main__":
app = QApplication()
w = Dialog()
w.show()
sys.exit(app.exec())