Qt自定义控件之动画文本

news2024/9/22 13:35:41

文章目录

  • 前言
  • 一、动画文本的效果
  • 二、具体实现
    • 定义动画对象
    • 设置动画时长的实现
    • 设置text函数实现
    • 绘制代码
    • 设置字体函数
  • 三、高级部分
  • 操作代码
  • 总结


前言

在 Qt 中,自定义控件可以让我们实现丰富的用户界面效果和交互体验。其中,动画文本是一种常见的效果,通过文本的动态变化可以吸引用户的注意力,增强用户体验。本文将介绍如何使用 Qt 实现一个动画文本的自定义控件,让你的应用程序更加生动活泼。


一、动画文本的效果

在这里插入图片描述

功能实现:
基础功能

  1. 设置text
  2. 设置字体颜色
  3. 设置动画速度
  4. 设置字体

高级功能
设置滚动方向

二、具体实现

首先我们这个是基于QWidget为父类的QPainter来实现的,我们的介绍课也已经讲了:
扬帆起航——Qt自定义控件介绍

定义动画对象

因为在此我们是使用坐标数值的变化,且是使用的是QPainter,所以我们使用:QVariantAnimation *var;对象来进行变化。
初始化对象:

	var = new QVariantAnimation(this);

    connect(var,&QVariantAnimation::valueChanged,this,[=](const QVariant&v)
    {
       y = v.toInt();//把动画的数值拿到
       qDebug() << "y=" << y;
       update();//进行刷新
    });

设置动画时长的实现

void AniLabel::Setspeed(int s)
{
    var->setDuration(s);//设置动画时间
}

设置text函数实现

定义存储text的变量

QString text;//实际的text
QString tempText;//过度text

tempText的功能是为了中间动画而设计的。
如下图过程所示:
在这里插入图片描述
所以在这个过程我们需要使用2个text。

实现text更改函数:


void AniLabel::SetText(const QString &s)
{
    tempText = text;//记住上次的text
    text = s;//更改text
    var->setStartValue(0);
    var->setEndValue(-height());
    var->start();//开启动画
}

绘制代码

开启我们的抗锯齿:

QPainter p(this);
p.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿效果

核心内容:

p.setFont(QFont("Ubuntu",30));
p.drawText(0,y,width(),height(),Qt::AlignCenter,tempText);
p.drawText(0,height() + y,width(),height(),Qt::AlignCenter,text);

我们可以看着刚刚的图来实现我们这部分的内容。

设置字体函数

QFont font;

void AniLabel::SetFont(const QFont &f)
{
    font = f;
    update();
}

三、高级部分

由于有上下左右四个方向,所以我们可以定义一个枚举来弄我们的方向。

enum Direct{
        top,//从下到上
        bottom,//从上到下
        right,//从左到右
        left//从右到左
    };

定义变量:
Direct d;

设置方向函数如下:

void AniLabel::SetDirect(AniLabel::Direct dir)
{
    d = dir;
    update();//这段代码可有可无
}

注意:这边需要一些小小的计算,如果不想计算可以直接抄哦~

设置动画函数如下:

void AniLabel::SetText(const QString &s)
{
	//........code
    
    switch(d)
    {
    case top:
        var->setStartValue(-height());
        var->setEndValue(0);
        break;
    case bottom:
        var->setStartValue(0);
        var->setEndValue(-height());
        break;
    case left:
        var->setStartValue(0);
        var->setEndValue(width());
        break;
    case right:
        var->setStartValue(width());
        var->setEndValue(0);
        break;
    }

    var->start();
}

动画槽函数如下:

connect(var,&QVariantAnimation::valueChanged,this,[=](const QVariant&v)
    {
       switch(d)
       {
       case top:
           y = v.toInt();
           break;
       case bottom:
           y = v.toInt();
           break;
       case left:
           x = v.toInt();
           break;
       case right:
           x = v.toInt();
           break;
       }
       update();
    });

绘画函数核心代码:

switch(d)
    {
    case top:
        p.drawText(0,y,width(),height(),Qt::AlignCenter,text);
        p.drawText(0,y+height(),width(),height(),Qt::AlignCenter,tempText);
        break;
    case bottom:
        p.drawText(0,y,width(),height(),Qt::AlignCenter,tempText);
        p.drawText(0,height() + y,width(),height(),Qt::AlignCenter,text);
        break;
    case left:
        qDebug() << "abs(x)" << abs(x);
        p.drawText(x,0,width(),height(),Qt::AlignCenter,tempText);
        p.drawText(x-width(),0,width(),height(),Qt::AlignCenter,text);
        break;
    case right:
        p.drawText(x,0,width(),height(),Qt::AlignCenter,text);
        p.drawText(x-width(),0,width(),height(),Qt::AlignCenter,tempText);
        break;
    }

操作代码

主文件实现效果代码:

通过定时器设置text

.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H


.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->widget->Setpeed(1000);
    ui->widget->SetText("Hello");

    QTimer *t = new QTimer(this);
    connect(t,&QTimer::timeout,this,[=]()
    {
        static int val = 0;
        ui->widget->SetText(QString::number(val));

        val++;
        val%=60;
    });

    t->start(1500);
}

MainWindow::~MainWindow()
{
    delete ui;
}

总结

通过本文的介绍,读者可以了解到如何使用 Qt 自定义控件实现动画文本,并了解相关的设计思路和实现技巧。通过掌握动画效果实现的方法,读者可以进一步深入学习和应用 Qt 的动画功能,提升自己在 Qt 开发中的能力和创造力。

(文章内容可根据实际情况进行调整和扩展,以符合你的需求和读者的背景。)

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

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

相关文章

电路分析基础学习(上)第4章

李瀚荪版电分第二版 ----------------------------------------------------------------------------------------------------------------------------- 求单口网络的VCR 两大基本方法&#xff1a; 1.外接电流源求电压&#xff1b; 2.外接电压源求电流&#xff1b; ---…

Netty序列化算法参数调优

目录 一、扩展序列化算法 1、Java 2、Json 二、参数调优 1、CONNECT_TIMEOUT_MILLIS 2、SO_BACKLOG 3、ulimit-n 4、TCP_NODELAY 5、SO_SNDBUF & SO_RCVBUF 6、ALLOCATOR 7、RCVBUF_ALLOCATOR 一、扩展序列化算法 1、Java 我们先写Java中jdk的序列方式&#x…

RabbitMQ系列(28)--RabbitMQ使用Federation Queue(联邦队列)解决异地访问延迟问题

前言&#xff1a; 联邦队列可以在多个Broker节点(或者集群)之间为单个队列提供均衡负载的功能。一个联邦队列可以连接一个或者多个上游队列(upstream queue)&#xff0c;并从这些上游队列中获取消息以满足本地消费者消费消息的需求。 1、Federation Queue工作原理图 2、添加策…

Oracle19c默认用户名system密码不正确不能登录问题解决

Oracle19c默认用户名system密码不正确不能登录问题解决 1、oracle 命令乱码问题 oracle乱码问题一般是由于oracle字符集设置和操作系统字符集设置不一致造成的。 查看oracle字符集方式如下&#xff1a; 1.进入sqlplus 命令&#xff1a; sqlplus /nolog2.以系统管理员身份连…

【Git原理与使用】-- 企业级开发模型

目录 引入 系统开发环境 Git 分支设计规范 master 分支 release 分支 develop 分支 feature 分支 hotfix 分支 开发场景 - 基于git flow模型的实践 DevOps研发平台 修复测试环境 Bug 修改预发布环境 Bug 修改正式环境 Bug 紧急修复正式环境 Bug 拓展实践 都说&a…

java的RSA加密解密示例

RSA算法是一种非对称加密算法&#xff0c;公钥和私钥都可以用于加密和解密操作。在RSA算法中&#xff0c;公钥用于加密数据&#xff0c;私钥用于解密数据。 具体来说&#xff0c;使用公钥加密的数据只能使用相应的私钥进行解密。而使用私钥加密的数据则可以使用相应的公钥进行…

【云原生|云计算系列】云计算基础概念

欢迎来到云原生专题的云计算系列第一篇博客&#xff0c;我们将探索云计算的基础知识&#xff0c;以帮助您深入了解这个迅速发展的领域。在前一篇博客中&#xff0c;我们介绍了云原生的概念和重要性&#xff0c;强调了它作为云计算的核心理念和实践的关键角色。本篇博客将进一步…

基于单片机智能水杯 保温杯 定时提醒喝水 温度控制的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前水温&#xff0c;定时提醒&#xff0c;水量变化DS18B20检测当前水体温度&#xff1b;水位传感器检测当前水位&#xff1b;继电器驱动加热片进行水温加热&#xff1b;定时提醒喝水&#xff0c;蜂鸣器报警&#x…

Vue + Volo.Abp 实现OAuth2.0客户端授权模式认证

文章目录 注册ClientOAuth2.0授权创建vue-oidc-client创建OAuth2.0认证跳转获取令牌创建回调页面创建退出登录 最终效果 Volo.Abp的 身份服务器模块默认使用 IdentityServer4实现身份认证。 IdentityServer4是一个开源的OpenID Connect和OAuth 2.0框架&#xff0c;它实现了这…

第41节:cesium 闪烁效果-熊出没(含源码+视频)

结果示例: 点的闪烁:1.逐渐放大后消失;2.点闪烁。 图的闪烁:熊出没,含自定义显示文字效果。 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false">

在当今这个信息时代,互联网中的隐私越来越重要,究竟是隐私换便利还是花钱护隐私呢?

一、互联网生存指南&#xff1a;通过哪些方法来加强个人信息保护&#xff1f; 网上注册内容时不要填写个人私密信息&#xff1a;互联网时代用户数和用户信息量已然和企业的盈利关联了起来&#xff0c;企业希望尽可能多地获取用户信息。但是很多企业在数据保护上所做的工作存在缺…

java.lang.IllegalArgumentException: Not a managed type

说在前面 真的哭死&#xff0c;全网所有报错都试过&#xff0c;都不是我的问题。解决之后太舒服了&#xff01; 第一个报错 首先&#xff0c;报错没有 TableGenerators 这个类&#xff0c;去 Jar 包看了一下还真没有。 这个类在 Javax 包的 2.2 版本有&#xff0c;添加如下…

Linux 网络延迟排查方法详解

概要 在 Linux 服务器中&#xff0c;可以通过内核调优、DPDK 以及 XDP 等多种方式提高服务器的抗攻击能力&#xff0c;降低 DDoS 对正常服务的影响。在应用程序中&#xff0c;可以使用各级缓存、WAF、CDN 等来缓解 DDoS 对应用程序的影响。 但是需要注意的是&#xff0c;如果 …

easyexcel 自定义列的导出

公司最近有个需求 就是将day这一列 变为excel表格表头&#xff0c;然后列显示薪水。 然后再到网上找教程最终终于找到相关的大神写的博客&#xff0c;具体网址忘记了。抱歉。现在写下具体教程。 ExcelHead 代码 import lombok.Data;/*** author hunterhou* date 2023/2/28 10:…

[分块][STL][树]【Centroids】不一样的解法

前言 一道好题&#xff0c;也就花了我一个下午而已。 本人做法比较清奇&#xff0c;可以当做开阔思路参考&#xff0c;并不太建议实操&#xff08;太难调了&#xff01;&#xff09;。 文章较啰嗦&#xff0c;谅解。 思路 众所周知&#xff0c;我并不太喜推式子&#xff0…

37.RocketMQ之Broker消息存储源码分析

highlight: arduino-light 消息存储文件 rocketMQ的消息持久化在我们在搭建集群时都特意指定的文件存储路径,进入指定的store目录下就可以看到。 下面介绍各文件含义 CommitLog 存储消息的元数据。produce发出的所有消息都会顺序存入到CommitLog文件当中。 CommitLog由多个文件…

javassist implements interface 模拟mybatis 生成代理类

动态创建代理对象的工具类 package com.wsd.util;import org.apache.ibatis.javassist.ClassPool; import org.apache.ibatis.javassist.CtClass; import org.apache.ibatis.javassist.CtMethod; import org.apache.ibatis.session.SqlSession;import java.lang.reflect.Const…

[工业互联-14]:机器人操作系统ROS与ROS2是如何提升实时性的?

目录 第1章 简介 第2章 历史 第3章 特点 &#xff08;1&#xff09;点对点设计 &#xff08;2&#xff09;不依赖编程语言 &#xff08;3&#xff09;精简与集成 &#xff08;4&#xff09;便于测试 &#xff08;5&#xff09;开源 &#xff08;6&#xff09;强大的库及…

ESP32连接云服务器【WebSocket】

ESP32连接云服务器【ESP32宝塔面板】 文章目录 ESP32连接云服务器【ESP32宝塔面板】&#x1f468;‍&#x1f3eb;内容1&#xff1a;背景&#x1f468;‍⚖️内容2&#xff1a;服务器配置&#x1f468;‍&#x1f4bb;内容3&#xff1a;ESP32配置 &#x1f468;‍&#x1f3eb;…

3.5.核函数的定义和使用

目录 前言1. 核函数2. 核函数案例总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简 CUDA 教程-核函数 课程大纲可看下面…