【PyQt5】paintEvent 绘制桌面时钟

在 PyQt5 中,paintEvent 函数是在窗口或小部件需要重绘时被调用的函数,通常在窗口或小部件第一次出现时、移动/调整大小时,以及内容发生更改时重绘。本文记录如何使用自定义 paintEvent 函数,绘制并实现桌面时钟小工具。

目录

1. paintEvent 简介

2. paintEvent 绘制桌面时钟


1. paintEvent 简介

        在 PyQt5 中,paintEvent 函数是在窗口或小部件需要重绘时被调用的函数。重绘通常在以下情况中发生:

  • 当窗口或小部件第一次出现时;
  • 当窗口或小部件被移动、调整大小或其他方式导致需要重绘时;
  • 当窗口或小部件的内容发生更改时。

在 paintEvent 函数中,可以使用 QPainter 类来绘制所需的图形或文本。例如,可以使用 drawText 方法在窗口中绘制文本。

def paintEvent(self, event):
   qp = QPainter(self)
   qp.drawText(10, 10, "Hello World")  # 在(10,10)位置绘制文本"Hello World"

2. paintEvent 绘制桌面时钟

        首先使用 Qt Designer 创建 ui 文件,布局选择水平栅格,然后放置 3 个 Label,用于显示时、分、秒,并调整 Label 的字体大小。

        接着创建一个新的 py 文件,调用 setupUi() 函数实现 ui 界面。然后自定义 paintEvent 函数,绘制时钟背景。

from PyQt5 import Qt, QtGui, QtCore, QtWidgets
from src.ui_deskClock import Ui_mainWidget

class deskClock(Qt.QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_mainWidget()
        self.ui.setupUi(self)

    def paintEvent(self, event):
        # 绘制圆角
        pat = Qt.QPainter(self)
        pat.setRenderHint(pat2.Antialiasing)
        brush = Qt.QBrush(Qt.QColor(51, 51, 51))
        pat.setBrush(brush)
        pat.setPen(QtCore.Qt.transparent)
        rectWidth = int(self.rect().width()/3)

        # 绘制3个圆角矩形
        for i in range(3):
            rect = self.rect()
            rect.setLeft(rectWidth*i+5)
            rect.setWidth(rectWidth-10)
            pat.drawRoundedRect(rect, 20, 20)

对功能进行完善,隐藏标题栏与设置透明背景,并增加更新时间和鼠标拖动功能,代码如下:

class deskClock(Qt.QWidget):
    def __init__(self):
        ...

        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)  # 隐藏标题栏
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)  # 透明背景

        # 窗口拖动参数
        self._mousePos = None
        self._tracking = False

        # 初始化
        self.updateTime()

        # 定时器
        self.timer_1s = QtCore.QTimer()
        self.timer_1s.timeout.connect(self.updateTime)
        self.timer_1s.start(1000)

    def paintEvent(self, event):
        ...

    def updateTime(self):
        now = QtCore.QTime.currentTime()
        hour = "{:02d}".format(now.hour())
        minute = "{:02d}".format(now.minute())
        second = "{:02d}".format(now.second())
        self.ui.hourLabel.setText(hour)
        self.ui.minuteLabel.setText(minute)
        self.ui.secondLabel.setText(second)

    def mousePressEvent(self, e: QtGui.QMouseEvent):
        if e.button() == QtCore.Qt.LeftButton:
            self._mousePos = e.globalPos() - self.pos()
            self._tracking = True
            self.setCursor(QtGui.QCursor(QtCore.Qt.OpenHandCursor))  # 修改鼠标样式

    def mouseMoveEvent(self, e: QtGui.QMouseEvent):
        if self._tracking:
            self.move(e.globalPos() - self._mousePos)

    def mouseReleaseEvent(self, e: QtGui.QMouseEvent):
        if e.button() == QtCore.Qt.LeftButton:
            self._tracking = False
            self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))  # 修改鼠标样式

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋洋Young

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值