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

《Qt窗口动画实战:Qt实现呼吸灯效果》

Qt窗口动画实战:Qt实现呼吸灯效果

在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。

一、实现原理

利用Qt自带的动画框架来实现,具体实现看代码:
在这里插入图片描述

2、代码实现

#ifndef BUTTON_H
#define BUTTON_H

#include <QPropertyAnimation>
#include <QSequentialAnimationGroup>
#include <QPainter>
#include <QColor>
#include <QWidget>

class BreathingLight : public QWidget {
  Q_OBJECT
  Q_PROPERTY(int alpha READ alpha WRITE setAlpha)

 public:
  BreathingLight(QWidget *parent = nullptr) : QWidget(parent), m_alpha(0) {
    setFixedSize(200, 200);

    // 创建两个动画,一个从0到255,一个从255到0
    QPropertyAnimation *animationUp = new QPropertyAnimation(this, "alpha");
    animationUp->setDuration(2500);  // 动画时长为2000毫秒
    animationUp->setStartValue(20);   // 起始透明度
    animationUp->setEndValue(255);   // 结束透明度
    animationUp->setEasingCurve(
        QEasingCurve::InOutQuad);  // 使用平滑的缓入缓出动画曲线

    QPropertyAnimation *animationDown = new QPropertyAnimation(this, "alpha");
    animationDown->setDuration(2500);   // 动画时长为2000毫秒
    animationDown->setStartValue(255);  // 起始透明度
    animationDown->setEndValue(20);      // 结束透明度
    animationDown->setEasingCurve(
        QEasingCurve::InOutQuad);  // 使用平滑的缓入缓出动画曲线

    // 创建一个动画组,将两个动画添加进去,并设置为循环播放
    QSequentialAnimationGroup *animationGroup =
        new QSequentialAnimationGroup(this);
    animationGroup->addAnimation(animationUp);
    animationGroup->addAnimation(animationDown);
    animationGroup->setLoopCount(-1);  // 无限循环
    animationGroup->start();           // 启动动画组
  }

  int alpha() const { return m_alpha; }

  void setAlpha(int alpha) {
    m_alpha = alpha;
    update();  // 更新窗口,触发重绘事件
  }

 protected:
  void paintEvent(QPaintEvent *event) override {
    Q_UNUSED(event);
    QPainter painter(this);
    QColor color(0, 255, 0, m_alpha);  // 绿色,使用 m_alpha 透明度
    painter.setBrush(color);
    painter.setPen(Qt::NoPen);
    QRect paint_rect = rect();
    paint_rect.adjust(90, 90, -90, -90);
    painter.drawEllipse(paint_rect);  // 绘制一个椭圆,填充整个窗口
  }

 private:
  int m_alpha;
};

#include <QApplication>
#include <QTableView>
#include <QHeaderView>
#include <QStandardItemModel>
#include "button.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //button.show();

    BreathingLight light;
    light.show();

    return a.exec();
}

#endif // BUTTON_H

3、总结:

利用Qt自带的动画系统可以很方便的就做出炫酷的效果,相比较其他传统的UI,Qt这个方案对用户来说其实还是很方便的。

相关文章:

  • 爬虫获取阿里巴巴 item_search 接口:根据关键字获取在售商品数据
  • 3-1 WPS JS宏工作簿的新建与保存(批量新建工作簿)学习笔记
  • yolov8_pose模型,使用rknn在安卓RK3568上使用
  • 如何正确的用 Cursor 打开 Unity 项目
  • Android 12系统源码_多屏幕(四)自由窗口模式
  • [原创]openwebui解决searxng通过接口请求不成功问题
  • Linux mount命令
  • C# 中 Array、ArrayList 和 List 的比较
  • 从“记住我”到 Web 认证:Cookie、JWT 和 Session 的故事
  • MySQL 8.4 SQL 全攻略:所有知识点与实战场景
  • Python常见面试题的详解25
  • ISIS(中间系统到中间系统)——基础
  • header在spring boot中解析
  • 什么是元数据管理?为什么数据治理的第一步是整理元数据?
  • docker container 修改 Mounts
  • Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】
  • SpringBoot AOP 源码解析
  • Selenium 不同语言绑定版本的官方操作文档获取途径(科学上网)
  • WPF12-MVVM
  • 禹神:一小时快速上手Electron,前端Electron开发教程,笔记。一篇文章入门Electron
  • 淘客单网站/如何快速推广app
  • 解决做网站问题/软文平台发布
  • html5网站开发方案/海外销售平台有哪些
  • 上海装修公司网站建设/首页关键词优化价格
  • 北京网站制作设计推广公司/最近一个月的热点事件
  • 网站不能访问如何做冗余/seo诊断分析在线工具