基于PyQt5的重绘机制实现加载页面
效果预览
直接看图,效果展现为跟随黑点顺时针转动,且有明暗变化
代码说明
控件初始化
initUI
主要用于初始化用户界面(UI)。它创建了一个具有特定样式、占位文本、只读属性的文本框,设置了初始字体大小,初始化了一个颜色列表,并创建了一个定时器用于触发部件重绘事件。
python
def initUI(self):
self.text_edit = QTextEdit(self) # 创建一个文本框
'''加粗斜体无边框'''
self.text_edit.setStyleSheet("font-style: italic; font-weight: bold; border: none; background-color: rgba(0, 0, 0, 0);")
self.text_edit.setPlaceholderText(self.__wait_info()) # 文本框内容
self.text_edit.setReadOnly(True) # 只读
'''设置初始字体大小'''
self.font = QFont()
self.font.setPointSize(1)
self.text_edit.setFont(self.font)
'''初始化RGB列表'''
self.color = []
for angle in range(0, 18):
self.color.append(14 * angle)
'''初始化定时器用于出发部件重绘事件'''
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_color)
self.timer.start(100)
self.color
用于存储颜色值,通过for
循环,将一系列值(14 的倍数,从 0 到 14*17)添加到颜色列表中self.timer
用于更新颜色,固定超时时间为每 100 毫秒触发一次超时信号
超时回调
- 拼接
self.color[1:]
与self.color[:1]
self.update
触发部件的重绘
python
def update_color(self):
'''更新RGB队列 模拟颜色变换'''
self.color = self.color[1:] + self.color[:1]
'''触发部件重绘:触发paintEvent事件,从而导致部件重新绘制自身'''
self.update()
重绘事件
self.__get_radius()
用于获取圆形的半径(根据窗口的大小动态计算)for angle in range(0, 18)
绘制18个点以组成圆型self.__paint_dot
用于在指定坐标绘制点
python
def __paint_circle(self):
'''计算当前窗口的中心坐标'''
__center_x = self.width() // 2
__center_y = self.height() // 2
'''更新半径,跟随窗口大小变化而变化'''
__radius = self.__get_radius()
for angle in range(0, 18):
'''计算绘制坐标'''
__x = __center_x + int(__radius * math.cos(math.radians(20 * (18 - angle))))
__y = __center_y + int(__radius * math.sin(math.radians(20 * (18 - angle))))
'''绘制点 点的颜色根据self.color的值进行变换'''
self.__paint_dot(__x, __y, self.color[angle])
'''重写基类的重绘事件'''
def paintEvent(self, event):
'''用于自定义部件的外观绘制'''
self.__paint_circle()
缩放事件
为了使UI 更友好,我们可以重写基类的resizeEvent
事件,使圆型可以根据窗口的大小自动变化大小
python
def resizeEvent(self, event):
'''当窗口或部件的大小发生改变时,resizeEvent方法会被自动调用'''
'''setGeometry 调整窗口部件的位置和大小'''
__center_x = self.width() // 2
__center_y = self.height() // 2 # 计算窗口的中心坐标
__font_size = min(event.size().width(), event.size().height()) // 45 # 根据窗口的新尺寸计算字体大小
__new_w = len(self.__wait_info()) * __font_size # 计算文本框的新宽度
'''计算文本框的新位置坐标'''
__new_x = __center_x - __new_w // 2
__new_y = __center_y + self.__get_radius() + 10
'''使用setGeometry方法设置文本框的新位置和大小'''
self.text_edit.setGeometry(__new_x,
__new_y,
__new_w,
int(__font_size * 2.7))
'''调整字体大小'''
self.font.setPointSize(__font_size)
self.text_edit.setFont(self.font)
在缩放事件产生时,会自动触发重绘事件
代码获取
请从我的资源获取