Qt/C++控件实例 QWidget联合动画实现卷轴效果

news2024/9/20 20:40:38

显示特点

  1. 动态翻页效果:数字在更新时,会有一个从前一数字向下一数字过渡的翻页效果。这种过渡动画使得数字变化过程更加平滑和自然,避免了突然的跳变。

  2. 高对比度显示:每个数字的背景框颜色为红色,数字颜色为白色,这种高对比度设计确保了数字在不同环境下的可读性。

  3. 多位数字同步翻转:控件支持同时翻转多位数字,适用于五位数的显示。每位数字都在相同的时间段内平滑地过渡到新的数值,营造整体的翻页效果。

这种翻页效果不仅美观,而且实用,适合需要频繁更新的数值显示场合,通过视觉动画增强用户体验。

#include "flipcounter.h"
#include <QPainter>

// 构造函数,初始化 FlipCounter 对象
FlipCounter::FlipCounter(QWidget *parent)
    : QWidget(parent), previousValue(0), currentValue(0), m_progress(0.0) {
    setFixedSize(260, 100); // 设置控件的固定大小为 260x100 像素

    // 初始化动画
    animation = new QPropertyAnimation(this, "progress"); // 创建动画对象,目标属性为 "progress"
    animation->setDuration(500); // 设置动画持续时间为 500 毫秒
    animation->setStartValue(0.0); // 动画开始值为 0.0
    animation->setEndValue(1.0); // 动画结束值为 1.0
    connect(animation, &QPropertyAnimation::valueChanged, this, QOverload<>::of(&FlipCounter::update)); // 连接动画的值变化信号到 update 槽函数,用于触发重绘
}

// 设置数字并开始动画
void FlipCounter::setNumbers(int previous, int current) {
    previousValue = previous; // 设置前一个数值
    currentValue = current; // 设置当前数值
    m_progress = 0.0; // 重置进度为 0.0

    // 开始翻页动画
    animation->start(); // 启动动画
}

// 获取当前进度
double FlipCounter::progress() const {
    return m_progress; // 返回当前进度
}

// 设置进度并更新绘制
void FlipCounter::setProgress(double value) {
    m_progress = value; // 设置新的进度值
    update(); // 触发重新绘制
}

// 绘制事件
void FlipCounter::paintEvent(QPaintEvent *event) {
    QPainter painter(this); // 创建 QPainter 对象
    painter.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿
    painter.setRenderHint(QPainter::TextAntialiasing); // 开启文字抗锯齿

    // 绘制整体背景
    painter.setBrush(QColor(22, 53, 81)); // 设置背景颜色为深蓝色
    painter.drawRect(0, 0, width(), height()); // 绘制整个控件的背景矩形

    // 设置字体
    QFont font = painter.font();
    font.setPointSize(32); // 设置字体大小为 32
    font.setBold(true); // 设置字体加粗
    painter.setFont(font); // 应用字体设置

    // 设置绘制参数
    int digitSpacing = 10; // 数字之间的水平间隔
    int charPadding = 4;   // 缩小背景框与数字的间隔
    int charWidth = (width() - (5 - 1) * digitSpacing) / 5; // 计算每个字符的宽度
    int charHeight = height() - 2 * charPadding; // 计算每个字符的高度

    // 将前一个数值和当前数值转换为 5 位的字符串,不足位用 0 填充
    QString prevText = QString("%1").arg(previousValue, 5, 10, QChar('0'));
    QString currText = QString("%1").arg(currentValue, 5, 10, QChar('0'));

    // 循环绘制每一位数字
    for (int i = 0; i < 5; ++i) {
        int prevDigit = prevText.mid(i, 1).toInt(); // 获取前一个数值的第 i 位数字
        int currDigit = currText.mid(i, 1).toInt(); // 获取当前数值的第 i 位数字

        QRect baseRect(i * (charWidth + digitSpacing), charPadding, charWidth, charHeight); // 计算当前位数字的基础矩形区域
        int offset = m_progress * charHeight; // 根据进度计算垂直偏移量

        QRect prevRect = baseRect.translated(0, -offset); // 计算前一个数字的位置,向上偏移
        QRect currRect = baseRect.translated(0, charHeight - offset); // 计算当前数字的位置,向下偏移

        // 绘制前一个数字及其背景框
        QRect prevBackgroundRect = prevRect.adjusted(-charPadding, -charPadding, charPadding, charPadding); // 计算前一个数字背景框的矩形区域
        painter.setBrush(QColor(200, 42, 65)); // 设置背景颜色为红色
        painter.setPen(Qt::NoPen); // 不绘制边框
        painter.drawRect(prevBackgroundRect); // 绘制前一个数字的背景框
        painter.setPen(Qt::white); // 设置画笔颜色为白色,用于绘制数字
        painter.drawText(prevRect, Qt::AlignCenter, QString::number(prevDigit)); // 在前一个数字的位置绘制数字

        // 绘制当前数字及其背景框
        QRect currBackgroundRect = currRect.adjusted(-charPadding, -charPadding, charPadding, charPadding); // 计算当前数字背景框的矩形区域
        painter.setBrush(QColor(200, 42, 65)); // 设置背景颜色为红色
        painter.setPen(Qt::NoPen); // 不绘制边框
        painter.drawRect(currBackgroundRect); // 绘制当前数字的背景框
        painter.setPen(Qt::white); // 设置画笔颜色为白色,用于绘制数字
        painter.drawText(currRect, Qt::AlignCenter, QString::number(currDigit)); // 在当前数字的位置绘制数字
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一个科研绘图·气泡图|24-08-24

一、气泡图 气泡图是一种数据可视化工具&#xff0c;它在传统的二维散点图的基础上增加了一个维度&#xff0c;使得我们能够同时观察三个变量之间的关系。这种图表通过点的大小来表示第三个数值变量的大小&#xff0c;从而提供了一种直观的方式来探索数据中的模式和趋势。 在…

Facebook的AI助手:如何提升用户社交体验的智能化

在现代社交媒体平台中&#xff0c;人工智能&#xff08;AI&#xff09;的应用正逐渐改变人们的社交体验。Facebook作为全球最大的社交媒体平台之一&#xff0c;已在AI技术的开发与应用上投入了大量资源&#xff0c;并通过其AI助手为用户提供了更加个性化、智能化的互动体验。这…

pycharm 隐藏 __ init __ .py 文件

pycharm 隐藏 __ init __ .py 文件 每次写python项目时&#xff0c;都会有一个自动生成__ init __ .py文件&#xff0c;看的很累&#xff0c;所以想把__ init __ .py文件给隐藏掉 方法&#xff1a; &#xff08;1&#xff09;File -> Settings (2) Appearance & Behav…

武汉流星汇聚:全球化布局与本地化运营,亚马逊电商帝国崛起秘诀

在数字时代的浪潮中&#xff0c;亚马逊如同一颗璀璨的星辰&#xff0c;照亮了全球电子商务的天空。作为美国乃至全球访问量最高的电商平台&#xff0c;亚马逊不仅重塑了消费者的购物习惯&#xff0c;更以其独特的商业模式、惊人的订单履行速度和卓越的购物体验&#xff0c;引领…

FFmpeg的入门实践系列四(AVS)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客参考书籍一、AVS简介二、基于FFmpeg配置AVS2 前期博客 FFmpeg的入门实践系列一(环境搭建) FFmpeg的入门实践系列…

零基础5分钟上手亚马逊云科技-利用MQ为应用解耦

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…

揭秘AI绘画赚钱之道:学会这十大技巧,轻松踏入高薪岗位,实现财务自由!

亲爱的学友们&#xff0c;当我们谈论AI绘画&#xff0c;不仅仅是在描绘科技如何重塑艺术疆界&#xff0c;更是在探索一场颠覆性的商业革命。自从AI绘画技术从萌芽走向繁荣&#xff0c;它已经从简单的图像风格转换跃升为能读懂人心、创世般生成各类视觉作品的神奇力量。今天&…

哈夫曼树和哈夫曼编码详解(包含Java代码实现)

目录 什么是哈夫曼树&#xff1f;如何构造哈夫曼树&#xff1f;构造过程代码实现哈夫曼树的结构构建哈夫曼树并计算WPL值测试代码 什么是哈夫曼编码&#xff1f;如何构建哈夫曼编码&#xff1f;构建过程代码实现 什么是哈夫曼树&#xff1f; 哈夫曼树又称为最优树&#xff0c;是…

应用实例 | Simufact 增材制造工艺仿真助力保时捷薄壁件打印

在过去的 30 多年里&#xff0c;增材制造技术被广泛应用于各行各业&#xff0c;尤其在医疗器械、航空领域尤为突出。其中激光束进行金属粉末床熔融的工艺应用最为广泛&#xff0c;由该工艺制造的零部件普遍兼具高设计自由度、高灵活性、优异机械性能等特点。对于汽车行业&#…

百日筑基第六十天-学习一下Tomcat

百日筑基第六十天-学习一下Tomcat 一、Tomcat 顶层架构 Tomcat 中最顶层的容器是 Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个 Server可以包含至少一个 Service&#xff0c;用于具体提供服务。Service 主要包含两个部分&#xff1a;Conn…

都说25张宇是大趋势,那660、880还刷吗?

25上半年张宇很火&#xff0c;是有客观原因的&#xff1a; 1. 大纲改革后&#xff0c;大题变少了&#xff0c;选填变多了&#xff1b; 2. 但是考试覆盖的知识点不能少&#xff0c; ——因为知识点越少&#xff0c;随机性越高&#xff0c;这个考试就越不公平。 这直接导致了&…

vue组件和插件使用

前端组件 1、安装pinia(Vue 的专属状态管理库)&#xff1a; npm install pinia2、安装pinia-plugin-persistedstate(持久存储插件): npm install pinia-plugin-persistedstate浏览器刷新时&#xff0c;有些数据希望是保存下来的。如用户登录后&#xff0c;用户信息会存储在全…

Scheme5.0标准之重要特性及用法实例(三十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

设置虚拟机使用主机以太网而不是WiF连接

虚拟机使用主机的以太网连接而不是Wi-Fi连接&#xff0c;可以通过在虚拟化软件中配置虚拟机的网络设置来实现。以下是一些常见的虚拟化软件&#xff08;如VMware和VirtualBox&#xff09;中设置虚拟机网络以使用以太网连接的步骤&#xff1a; 一、VMware中设置 1、打开虚拟网…

Python画笔案例-007 绘制水滴

1、绘制水滴 通过 python 的turtle 库绘制一个水滴的图案&#xff0c;如下图&#xff1a; 2、实现代码 今天绘制的水滴&#xff0c;在tuitle 库里并没有直接的功能可以绘制&#xff0c;我们仔细观察&#xff0c;可以看出&#xff0c;水滴往下越来越粗&#xff0c;所以我们可以…

API商品数据接口(电商数据api)——京东淘宝价格详情

众多品牌选择使用比价工具进行采购&#xff0c;主要是出于以下几个重要原因&#xff1a; 提高开发效率&#xff1a;API接口允许不同的应用程序之间高效地进行交互&#xff0c;节省了大量的人力物力成本&#xff0c;使得开发者可以将更多时间和精力集中于自身的核心业务。 增加数…

正则表达式匹配成对括号

匹配一对括号&#xff0c;用于在一个html文本中提取JSon 文本。例如 { “duration”:7599,"minBufferTime{second bracket }{third bracket} } 一对加粗的{} &#xff0c;而不要中间的{}。简单写法会出现错误匹配。 在.Net Framework的正则表达式中&#xff0c;提供了”…

在Activity中使用Toast

在Activity中使用Toast Toast是Android系统提供的一种非常好的提醒方式&#xff0c;在程序中可以使用它将一些短小的信息通知给用户&#xff0c;这些信息会在一段时间后自动消失&#xff0c;并且不会占用任何屏幕空间&#xff0c;我们现在就尝试一下如何在活动中使用Toast。 …

谷粒商城篇章11--P311-P325--秒杀服务【分布式高级篇八】

目录 1 后台添加秒杀商品 1.1 配置优惠券服务网关 1.2 添加秒杀场次 1.3 上架秒杀商品 2 定时任务 2.1 cron 表达式 2.2 cron表达式特殊字符 2.3 cron示例 3 秒杀服务 3.1 创建秒杀服务模块 3.1.1 pom.xml 3.1.2 application.yml配置 3.1.3 bootstrap.yml配置 3.…

【赵渝强老师】Docker三剑客

在Docker容器中提供了三个非常有用的工具&#xff0c;它们分别是&#xff1a;Docker Compose、Docker Machine和Docker Swarm。下面分别进行介绍。 视频讲解如下&#xff1a; Docker三剑客 【赵渝强老师】Docker的三剑客 一、容器编排工具Docker Compose 在使用Docker部署应用…