当前位置: 首页 > news >正文

Qt 小功能:加载等待动画——转圈圈

加载等待动画实现——转圈圈

效果图:(看封面最好)

在这里插入图片描述

关键要点

  1. 流畅的动画
    • 使用 QTimer 每 50 毫秒更新一次动画,确保动画流畅。
  2. 视觉效果
    • 使用 QPainter 的平滑像素转换和抗锯齿选项,提高动画的视觉质量。
    • 设置窗口属性为透明背景,使动画可以覆盖在其他内容上。
  3. 性能优化
    • 只在需要时更新动画,避免不必要的重绘。

关键要点

  1. 流畅的动画
    • 使用 QTimer 每 50 毫秒更新一次动画,确保动画流畅。
  2. 视觉效果
    • 使用 QPainter 的平滑像素转换和抗锯齿选项,提高动画的视觉质量。
    • 设置窗口属性为透明背景,使动画可以覆盖在其他内容上。
  3. 性能优化
    • 只在需要时更新动画,避免不必要的重绘。

实现代码:

//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));
}

使用方法

  1. 创建等待动画对象

    WaitWidge* waitWidget = new WaitWidge(this);
    
  2. 显示等待动画

    waitWidget->show();
    
  3. 隐藏等待动画

    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);
}


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 机械行业数字化生产供应链产品解决方案(三)
  • 进程间的通信方式有几种?
  • Handler 消息处理机制总结
  • 【ARM Coresight Trace 系列文章 2.3 -- 简单介绍 ITM 比 Uart 的优点】
  • 【Linux系列】known_hosts详解
  • 白盒测试-发送请求-引出MockMvc源码类
  • 通过网关将数据上传到两台eqmx服务器上
  • Linux企业级应用(一)构建企业级Linux应用平台:全面指南
  • 算法:外卖调度
  • Python自动化测试之selenium - 元素定位
  • 【人工智能】Transformers之Pipeline(九):物体检测(object-detection)
  • 企业信息化建设搞得好了叫系统工程,搞不好叫面子工程
  • 放飞孔明灯
  • MySql的默认隔离级别是什么?可以解决幻读问题吗?
  • 嵌入式八股文-网络编程、多线程和进程
  • ➹使用webpack配置多页面应用(MPA)
  • Android优雅地处理按钮重复点击
  • co.js - 让异步代码同步化
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • React as a UI Runtime(五、列表)
  • Unix命令
  • 从零开始的无人驾驶 1
  • 浏览器缓存机制分析
  • 漂亮刷新控件-iOS
  • 跳前端坑前,先看看这个!!
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习使用ExpressJS 4.0中的新Router
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • python最赚钱的4个方向,你最心动的是哪个?
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # 达梦数据库知识点
  • # 职场生活之道:善于团结
  • #{}和${}的区别?
  • #HarmonyOS:Web组件的使用
  • #pragma data_seg 共享数据区(转)
  • #微信小程序:微信小程序常见的配置传值
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (每日一问)基础知识:堆与栈的区别
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十二)Flink Table API
  • ***原理与防范
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net 验证控件和javaScript的冲突问题
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • @vue/cli 3.x+引入jQuery