Qt 小功能:加载等待动画——转圈圈
加载等待动画实现——转圈圈
效果图:(看封面最好)

关键要点
- 流畅的动画:
- 使用
QTimer每 50 毫秒更新一次动画,确保动画流畅。
- 使用
- 视觉效果:
- 使用
QPainter的平滑像素转换和抗锯齿选项,提高动画的视觉质量。 - 设置窗口属性为透明背景,使动画可以覆盖在其他内容上。
- 使用
- 性能优化:
- 只在需要时更新动画,避免不必要的重绘。
关键要点
- 流畅的动画:
- 使用
QTimer每 50 毫秒更新一次动画,确保动画流畅。
- 使用
- 视觉效果:
- 使用
QPainter的平滑像素转换和抗锯齿选项,提高动画的视觉质量。 - 设置窗口属性为透明背景,使动画可以覆盖在其他内容上。
- 使用
- 性能优化:
- 只在需要时更新动画,避免不必要的重绘。
实现代码:
//WaitWidge.h//
#ifndef WAITWIDGE_H
#define WAITWIDGE_H#include <QWidget>
#include <QPaintEvent>// WaitWidge 类继承自 QWidget,用于显示等待动画
class WaitWidge : public QWidget
{Q_OBJECTpublic:WaitWidge(QWidget *parent = nullptr);~WaitWidge();protected:// 重载 paintEvent 方法,用于自定义绘制void paintEvent(QPaintEvent *) override;private:QPixmap* m_pPixmap; // 用于储存等待动画图片QTimer* m_pTimer; // 用于更新动画
};//WaitWidge.cpp//
#endif // WAITWIDGE_H
#include "WaitWidge.h"
#include <QPainter>
#include <QTimer>// 静态变量,用于记录旋转次数
static int count = 0;WaitWidge::WaitWidge(QWidget *parent): QWidget(parent)
{// 设置窗口标志为无边框和工具窗口setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);// 设置窗口属性为透明背景setAttribute(Qt::WA_TranslucentBackground, true);// 加载等待动画图片m_pPixmap = new QPixmap("://wait.png");// 创建定时器,用于定时更新动画m_pTimer = new QTimer(this);// 连接定时器的 timeout 信号到更新槽函数connect(m_pTimer, &QTimer::timeout, [=]{update(); // 更新窗口,触发 paintEvent});// 启动定时器,每 50 毫秒触发一次m_pTimer->start(50);
}WaitWidge::~WaitWidge() {}// 重载 paintEvent 方法
void WaitWidge::paintEvent(QPaintEvent *)
{// 创建 QPainter 对象,用于绘制QPainter painter(this);// 设置绘制选项painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing);painter.setPen(Qt::NoPen);painter.setBrush(Qt::NoBrush);// 计算绘制区域,使图片居中QRect trect((rect().width() - 128)/2, (rect().height() - 128)/2, 128, 128);// 创建 QMatrix 对象,用于旋转图片QMatrix matrix;// 旋转图片,每次旋转 10 度matrix.rotate((10 * (count++)) % 360);// 绘制旋转后的图片painter.drawPixmap(trect, m_pPixmap->transformed(matrix, Qt::SmoothTransformation));
}
使用方法
-
创建等待动画对象:
WaitWidge* waitWidget = new WaitWidge(this); -
显示等待动画:
waitWidget->show(); -
隐藏等待动画:
waitWidget->hide();
调用实例代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "WaitWidge.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow() = default;protected:void resizeEvent(QResizeEvent* event) override;void showEvent(QShowEvent* event) override;private:void centerWaitWidget();private:WaitWidge* waitWidget;
};#endif // MAINWINDOW_H
#include "MainWindow.h"
#include <QPushButton>
#include <QVBoxLayout>
#include <QResizeEvent>
#include <QShowEvent>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), waitWidget(new WaitWidge(this))
{// 设置主窗口的大小setFixedSize(400, 300);// 创建一个按钮,用于显示和隐藏等待动画QPushButton* button = new QPushButton("Toggle Wait Widget", this);connect(button, &QPushButton::clicked, [this]{if (waitWidget->isVisible()){waitWidget->hide();}else {waitWidget->show();centerWaitWidget(); // 显示时重新计算位置}});// 创建一个布局,将按钮添加到布局中QVBoxLayout* layout = new QVBoxLayout;layout->addWidget(button);// 创建一个中心部件,并将布局设置为中心部件的布局QWidget* centralWidget = new QWidget(this);centralWidget->setLayout(layout);setCentralWidget(centralWidget);// 设置等待动画组件的初始大小waitWidget->setFixedSize(128, 128);waitWidget->hide(); // 初始时隐藏等待动画
}void MainWindow::resizeEvent(QResizeEvent* event)
{QMainWindow::resizeEvent(event);centerWaitWidget(); // 窗口大小改变时重新计算位置
}void MainWindow::showEvent(QShowEvent* event)
{QMainWindow::showEvent(event);centerWaitWidget(); // 窗口显示时计算位置
}void MainWindow::centerWaitWidget()
{// 获取主窗口的全局坐标QPoint globalPos = mapToGlobal(rect().topLeft());int x = globalPos.x() + (width() - waitWidget->width()) / 2;int y = globalPos.y() + (height() - waitWidget->height()) / 2;waitWidget->move(x, y);
}
= mapToGlobal(rect().topLeft());
int x = globalPos.x() + (width() - waitWidget->width()) / 2;
int y = globalPos.y() + (height() - waitWidget->height()) / 2;
waitWidget->move(x, y);
}
相关文章:
Qt 小功能:加载等待动画——转圈圈
加载等待动画实现——转圈圈 效果图:(看封面最好) 关键要点 流畅的动画: 使用 QTimer 每 50 毫秒更新一次动画,确保动画流畅。 视觉效果: 使用 QPainter 的平滑像素转换和抗锯齿选项,提高动画…...
【Linux进程篇】进程终章:POSIX信号量线程池线程安全的单例模式自旋锁读者写者问题
W...Y的主页 😊 代码仓库分享 💕 前言:在之前的进程间通信时我们就讲到过信号量,他的本质就是一个计数器,用来描述临界资源的一个计数器。我们当时使用电影院的例子来说明信号量。电影院的座位被我们称为临界资源&a…...
MathType7.5破解版下载安装激活图文详细教程(附激活秘钥)
🌟 引言:揭秘MathType,数学编辑的瑞士军刀! 嘿,各位小伙伴,今天我要给你们安利一个我超级喜欢的数学神器——MathType!如果你跟我一样,在处理数学公式时常常感到头疼,那你…...
2-62 基于MATLAB gui 编制短波通信系统
基于MATLAB gui 编制短波通信系统,录制一段语音信号,分别通过AM SSB DSB 等调制信号,加入噪声,然后解调出来,可比较各种调制解调方式的优劣。程序已调通,可直接运行。 2-62 matlab gui - 小红书 (xiaohongs…...
windows C++-C++/WinRT 中创建组件和事件(下)
跨 ABI 的简单信号 如果无需连同事件传递任何形参或实参,则可以定义自己的简单 Windows 运行时委托类型。 以下示例展示 Thermometer 运行时类的更简易版本。 它声明名为 SignalDelegate 的委托类型,然后使用该类型来引发信号类型事件,而不是…...
C++初学者指南-5.标准库(第二部分)--二叉堆操作
C初学者指南-5.标准库(第二部分)–二叉堆操作 文章目录 C初学者指南-5.标准库(第二部分)--二叉堆操作背景什么是“堆”二叉最大堆二叉树的表示 堆操作C标准库中的堆初始化堆收缩堆增长堆 辅助操作sort_heap (Heap → Sorted Array)is_heapis_heap_until 相关内容 不熟悉 C 的标…...
在Ubuntu 16.04上安装Git的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 在现代软件开发中,一个不可或缺的工具是某种版本控制系统。版本控制系统允许您在源代码级别跟踪软件。您可以跟踪更改…...
redis内存淘汰策略-------Reservoir Sampling(水库采样)
文章目录 过期删除策略和内存淘汰策略内存淘汰策略evictionPoolEntryevictionPoolPopulate Reservoir SamplingdictGetRandomKeydictGetSomeKeysReservoir Samplingchatgpt对Reservoir Sampling的介绍 过期删除策略和内存淘汰策略 详细介绍请参考博客“redis过期删除策略和内存…...
C++《类和对象》(上)
在之前的C入门基础知识中我们了解了C的发展过程已经重要性,还初步了解了C中一些相比C语言特有的知识点,例如命名空间、缺少参数、函数重载、引用等,接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象,类和对…...
LLM大语言模型算法特训
百度 LLM(Large Language Model)大语言模型算法特训是一个深度学习领域的高级培训项目,专门设计用于训练和优化大规模语言模型的开发者和研究人员。本文将详细探讨LLM算法的基本原理、训练技术、应用领域以及参与者可以预期的学习收获和挑战。…...
Docker相关笔记
Docker笔记 1. Dockerfile编译构建docker Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。 Dockerfile 常用的有如下关键字: FROM:指定基础镜像,后续定制操作都是基于这个基础镜像,比如: …...
前端技术day01-HTML入门
一、前端介绍 技术描述HTML用于构建网站的基础结构的CSS用于美化页面的,作用和化妆或者整容作用一样JS实现网页和用户的交互Vue主要用于将数据填充到html页面上的Element主要提供了一些非常美观的组件 二、工具软件 VsCode 在前端领域,有一个公认好用…...
Multisim 用LM358 运放模拟线性稳压器 - 运放输出饱和 - 前馈电容
就是拿运放搭一个可调的LDO 稳压器,类似下面这个功能框图里的感觉。本来应该非常简单,没什么好说的,没想到遇到了两个问题。 原理 - 理想运放 我用PNP 三极管Q2 作为输出,运放输出电压升高时,流过PNP 三极管BE 的电流变…...
宁德大屏第二版总结
碰到难点 1.wss 心跳机制 实现前端和后端双向绑定 只要后端发送了消息 前端通过全局总线去触发你想要的函数。 全局总线 vue3可以全局总线下一个mitt 新建一个eventBus.js import mitt from "mitt"; const eventBus mitt();export default eventBus; 然后wss…...
冥想第一千二百四十七天(1247)
1.今天上午带桐桐去游泳了,买了卡吉诺,吃过最好吃的甜点。推荐。还有鸡排。 2.回来后带着媳妇,先加油。去给丈母娘看腿,等丈母娘等了好久,还帮她推车。 3.回来后,在丈母娘家跑步。很舒服。家长麦田的香味。…...
基于光学动捕定位下的Unity-VR手柄交互
Unity VR 场景手柄交互实现方案 需求 在已创建好的 Unity VR 场景中,接入游戏手柄,通过结合动捕系统与 VRPN,建立刚体,实时系统获取到手柄的定位数据与按键数据,通过编写代码实现手柄的交互逻辑,实现手柄…...
php json_decode 带反斜杠字符串json解析
PHP json_decode 带反斜杠字符串json解析 今天再次遇到了json字符串中包含反斜杠的问题,记录下解决方法 在JSON字符串中,反斜杠\用作转义字符。当JSON_UNESCAPED_SLASHES选项被用于json_encode()函数时,不会在slashes前面添加反斜杠。 但是…...
【NLP】文本张量表示方法【word2vec、词嵌入】
文章目录 1、文本张量表示2、one-hot词向量表示2.1、one-hot编码代码实现:2.2、onehot编码器的使用2.3、one-hot编码的优劣势 3、word2vec模型3.1、模型介绍3.2、CBOW模式3.3、skipgram模式3.4、word2vec的训练和使用3.4.1、获取训练数据3.4.2、训练词向量3.4.3、查…...
疯狂Java讲义_08_泛型
文章目录 泛型的传参若函数里的参数使用基类接受所有的派生类,怎么做? 类型通配符的上限类型通配符的下限 泛型的传参 注意 若类 Base 是类 Derived 的基类(父类),那么数组类型 Base[] 是 Derived[] 的基类࿰…...
HCIA、OSPF笔记
一、OSI参考模型 1、OSI的结构 应用层:把人类语言转化成编码,为各种应用程序提供网络服务。 表示层:定义一些数据的格式,(对数据进行加密、解密、编码、解码、压缩、解压缩,每一层都可以实现,…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
