PyQt5

基于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)

在缩放事件产生时,会自动触发重绘事件

代码获取

请从我的资源获取

相关推荐
qq_49244844633 分钟前
Jmeter设置负载阶梯式压测场景(详解教程)
开发语言·python·jmeter
lianyinghhh1 小时前
瓦力机器人-舵机控制(基于树莓派5)
人工智能·python·自然语言处理·硬件工程
ID_180079054731 小时前
京东获取整站实时商品详情数据|商品标题|数据分析提取教程
java·开发语言
ajassi20001 小时前
开源 C++ QT QML 开发(十七)进程--LocalSocket
c++·qt·开源
Mike_Zhang1 小时前
python3.14版本的free-threading功能体验
python
StarPrayers.2 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
qiuiuiu4132 小时前
正点原子RK3568学习日志-编译第一个驱动程序helloworld
linux·c语言·开发语言·单片机
木头左2 小时前
波动率聚类现象对ETF网格密度配置的启示与应对策略
python
molong9312 小时前
Kotlin 内联函数、高阶函数、扩展函数
android·开发语言·kotlin
华仔AI智能体3 小时前
Qwen3(通义千问3)、OpenAI GPT-5、DeepSeek 3.2、豆包最新模型(Doubao 4.0)通用模型能力对比
人工智能·python·语言模型·agent·智能体