首页 > 其他分享 >Qt自定义控件之动画文本

Qt自定义控件之动画文本

时间:2023-08-12 18:31:45浏览次数:56  
标签:case 控件 Qt 自定义 动画 text height var

@TOC


前言

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


一、动画文本的效果

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的功能是为了中间动画而设计的。

如下图过程所示:

Qt自定义控件之动画文本_自定义控件_02

所以在这个过程我们需要使用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 开发中的能力和创造力。

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

标签:case,控件,Qt,自定义,动画,text,height,var
From: https://blog.51cto.com/u_16176403/7060830

相关文章

  • 在传奇游戏界面添加或删除自定义功能按钮
    本教程是以HERO引擎和非凡登录器(原猎鹰登录器)为例进行示范,其他引擎请自行进行测试,。自定义功能按钮就是在游戏界面中处于小地图,组队等按钮上面的一排可自定义进行功能设置的按钮,如图中所示,用方框选中的就是想要达到的效果。以下是具体添加方法:首先要下载下面我们给大家准备好的一......
  • C++系列三:QT初识
    目录前言QT介绍前言开发环境,挺折腾人,一波三折。参考链接:C语言中文网、QT快速入门官方文档QT介绍跨平台的GUI。主要用于桌面程序开发和嵌入式开发。目前Qt的开源授权有两种,一种是GPL授权,另一种是LGPL授权QML主要用于手机移动应用程序Windows下的GUI解决方案......
  • occ配置(opencascade+qt+vs)
    配了几天终于配完了我真的删q先是下载了qt5.12.1和opencascade7.4.0和visualstudio2017和b站一个博主(城外柳依依)一起配的,配完还是报错先是找不到qt5scoreed.lib最后我把这个文件找到(D:\Qt\Qt5.12.1\5.12.1\msvc2017_64\lib),然后两个对应的文件复制到opencascadein64文件夹里......
  • SpringBoot复习:(21)自定义ImportBeanDefinitionRegistrar
    要达到的目的:将某个包下使用了某个自定义注解(比如@MyClassMapper)的类注册到Spring容器。一、自定义注解:packagecom.example.demo.service;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)publ......
  • 自定义键盘
    1.下载刷写工具在https://www.wch.cn/downloads/WCHISPTool_Setup_exe.html 下载WCHISPStudio工具此工具为CH552G芯片厂商沁恒官方烧录工具(仅有windows版本)2.刷写最新键盘固件最新固件:threekey_v5.1.hex 点击下载3、设置下载固件打开WCHISPStudio按下图设置将USB线......
  • Apache Nginx中记录自定义Header
    从Apache切到Nginx需要保持日志格式统一,以便兼容之前的数据统计脚本现在Apache的日志格式为:LogFormat"%h%t%m%U%q%>s%{HEAD}i%D"说明:%h:客户端IP地址%t:时间(标准英语格式)%m:请求的方法(GET,POST)%U:请求的URL路径,不包含查询字符串%q:查询字符串%>s:请求的最终状态%{HEAD}i:请......
  • 让Webbrowser、CDHtmlDialog中的控件显示为系统主题样式
    方法1:在HTML文件里加上如下代码<METAHTTP-EQUIV="MSThemeCompatible"CONTENT="Yes">方法3:在以CDHtmlDialog类为基类的头文件中加入如下代码(推荐)classCWebBrowserThemeDlg:publicCDHtmlDialog{STDMETHOD(GetHostInfo)(DOCHOSTUIINFO*pInfo){pInfo->dwFlags|......
  • WPF图形控件使用之-VisualBrush图形画刷
    VisualBrush 背景图 Background上画,线条(LineGeometry)、几何图形(RectangleGeometry)、椭圆(EllipseGeometry)、弧线(ArcSegment )、各种控件等,相对与DrawingBrush书写更简单一些。 属性说明备注Viewport(从左向右,从上向下,图像宽度放大比例,图像高度放大比例)放大背......
  • 自定义feign 解码器Decoder
    直接上代码packagecom.haier.hibp.stock.config;importcom.alibaba.fastjson.JSON;importcom.haier.hibp.stock.constant.WebConstants;importcom.haier.hibp.stock.service.form.FeignResultDto;importfeign.FeignException;importfeign.Response;importfeign.Uti......
  • Linux MQTT智能家居项目(智能家居界面布局)
    (文章目录)前言一、创建工程项目1.选择工程名称和项目保存路径2.选择QWidget3.添加保存图片的资源文件:在工程目录下添加Icon文件夹保存图片:将文件放入目录中:将图片添加进入资源文件中:二、界面布局准备工作这里我们一共显示4个界面:LED控制界面,温度湿度显示界面,光......