在 PyQt5 中,paintEvent 函数是在窗口或小部件需要重绘时被调用的函数,通常在窗口或小部件第一次出现时、移动/调整大小时,以及内容发生更改时重绘。本文记录如何使用自定义 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)) # 修改鼠标样式