Qt Widget 自定义按钮应用

QPropertyAnimation 类应用

QPropertyAnimation类是Qt中的动画类,用于将属性值从一个值平滑地过渡到另一个值。它可以用于各种Qt对象(如QWidget、QGraphicsItem等)的属性动画,例如移动位置、改变大小、旋转等。QPropertyAnimation类可以设置目标对象、属性名称、起始值、结束值、持续时间、加速度曲线等属性。在动画过程中,QPropertyAnimation会自动更新目标对象的属性值,从而实现动画效果。QPropertyAnimation类具有各种信号,如valueChanged()和finished(),可用于监视动画的进度和完成情况。

使用QPropertyAnimation类需要以下步骤:

  1. 创建动画对象并设置动画参数,如目标对象、属性名称、动画时长、缓动曲线等。

  2. 启动动画对象并开启事件循环,让动画对象按照预设的参数逐帧执行动画过渡。

  3. 在动画结束后进行清理工作,如解除对象和动画对象的关联关系,释放动画对象的内存等。

Widget 控件显示文字及图像方法

示例:实现下图

UI绘图:

增加一个新类:.h和.cpp文件自己加析构函数

代码示例:

animationbutton.h

#ifndef ANIMATIONBUTTON_H
#define ANIMATIONBUTTON_H

#include <QWidget>
#include <QVariant>
class QPropertyAnimation;
#include "qdebug.h"
#include "qpainter.h"
#include "qpropertyanimation.h"

class AnimationButton : public QWidget
{
    Q_OBJECT
public:
    explicit AnimationButton(QWidget *parent = nullptr);
    ~AnimationButton();

protected:
    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);
    void paintEvent(QPaintEvent *event);

private:
    bool enter; // 是否进入
    bool leave; // 是否离开
    int pixwidth; // 图片宽度
    int pixheight; // 图片调度
    int oldwidth; // 图片原宽度
    int oldheight; // 图片原高度

    int targetwidth; // 目标宽度
    int targetheight; // 目标高度
    QString text; // 图像文字
    QString image; // 图像路径

    QPropertyAnimation *enteranimation; // 进入动画
    QPropertyAnimation *leaveanimation; // 离开动画

private slots:
    void enterimagechanged(QVariant index);
    void leaveimagechanged(QVariant index);

public slots:
    void settext(QString text); // 显示文字
    void setimage(QString image); // 显示图像

};

#endif // ANIMATIONBUTTON_H

frmanimationbutton.h

#ifndef FRMANIMATIONBUTTON_H
#define FRMANIMATIONBUTTON_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class FrmAnimationButton; }
QT_END_NAMESPACE

class FrmAnimationButton : public QWidget
{
    Q_OBJECT

public:
    FrmAnimationButton(QWidget *parent = nullptr);
    ~FrmAnimationButton();

private:
    Ui::FrmAnimationButton *ui;
};
#endif // FRMANIMATIONBUTTON_H

animationbutton.cpp

#include "animationbutton.h"

AnimationButton::AnimationButton(QWidget *parent) : QWidget(parent)
{
    enter=true;
    leave=false;
    pixwidth=0;
    pixheight=0;
    oldwidth=0;
    oldheight=0;

    enteranimation=new QPropertyAnimation(this,"");
    enteranimation->setStartValue(0);
    enteranimation->setEndValue(5);
    enteranimation->setDuration(200);
    connect(enteranimation,SIGNAL(valueChanged(QVariant)),this,
            SLOT(enterimagechanged(QVariant)));

    leaveanimation=new QPropertyAnimation(this,"");
    leaveanimation->setStartValue(0);
    leaveanimation->setEndValue(5);
    leaveanimation->setDuration(200);
    connect(leaveanimation,SIGNAL(valueChanged(QVariant)),this,
            SLOT(leaveimagechanged(QVariant)));

}

AnimationButton::~AnimationButton()
{
    // 删除对象指针
    delete enteranimation;
    delete leaveanimation;
}

void AnimationButton::enterEvent(QEvent *event)
{
    enter=true;
    leave=false;
    pixwidth=pixwidth-25;
    pixheight=pixheight-25;
    enteranimation->start();
}

void AnimationButton::leaveEvent(QEvent *event)
{
    enter=false;
    leave=true;
    pixwidth=oldwidth;
    pixheight=oldheight;
    leaveanimation->start();
}

void AnimationButton::paintEvent(QPaintEvent *event)
{
    if(image.isEmpty())
    {
        return ;
    }

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 通过此QPixmap类中scaled()函数对图像进行放大或缩小
    QPixmap pix(image);
    pix=pix.scaled(targetwidth,targetheight,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);

    if(enter || leave)
    {
        int pixx=rect().center().x()-targetwidth/2;
        int pixy=rect().center().y()-targetheight/2;

        QPoint point(pixx,pixy);
        painter.drawPixmap(point,pix);
        painter.drawText(QRectF(0,height()-20,width(),20),Qt::AlignCenter,text);
    }
}

void AnimationButton::enterimagechanged(QVariant index)
{
    int i=index.toInt();
    targetwidth=pixwidth+i*5;
    targetheight=pixheight+i*5;
    update();
}

void AnimationButton::leaveimagechanged(QVariant index)
{
    int i=index.toInt();
    targetwidth=pixwidth-i*5;
    targetheight=pixheight-i*5;
    update();
}

void AnimationButton::settext(QString text) // 显示文字
{
    this->text=text;
    update();
}

void AnimationButton::setimage(QString image) // 显示图像
{
    this->image=image;
    QPixmap pix(image);
    pixwidth=pix.width();
    pixheight=pix.height();
    oldwidth=pixwidth;
    oldheight=pixheight;

    targetwidth=pixwidth-25;
    targetheight=pixheight-25;
    update();
}

frmanimationbutton.cpp

#include "frmanimationbutton.h"
#include "ui_frmanimationbutton.h"

FrmAnimationButton::FrmAnimationButton(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::FrmAnimationButton)
{
    ui->setupUi(this);

    setWindowTitle("自定义widget");

    QString qss="color:#BECEC6;background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #1B3152,stop:1 #255C80);";
    this->setStyleSheet(qss);

    ui->widget1->settext("家居");
    ui->widget1->setimage(":/new/prefix1/image/v-home.png");

    ui->widget2->settext("成员");
    ui->widget2->setimage(":/new/prefix1/image/v-contact.png");

    ui->widget3->settext("图片");
    ui->widget3->setimage(":/new/prefix1/image/v-img.png");

    ui->widget4->settext("通信");
    ui->widget4->setimage(":/new/prefix1/image/v-record.png");

    update();
}

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

main.cpp

#include "frmanimationbutton.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    FrmAnimationButton w;
    w.show();
    return a.exec();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】map/multimap/set/multiset的经典oj例题 [ 盘点&全面解析 ] (28)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.前K个高频单词【mutiset】二.左右符…

Advanced Renamer

Advanced Renamer 安装链接 1.前后添加字符 2.字符转数字&#xff0c;编号整体加减

AIGC专题报告:AIGC助力大规模对象存储服务OSS的能效提升

今天分享的AIGC系列深度研究报告&#xff1a;《AIGC专题报告&#xff1a;AIGC助力大规模对象存储服务OSS的能效提升》。 &#xff08;报告出品方&#xff1a;全球软件开发大会&#xff09; 报告共计&#xff1a;18页 结合AI的智能运维助力能效提升 场景1&#xff1a;通过 AI…

Java Spring + SpringMVC + MyBatis(SSM)期末作业项目

本系统是一个图书管理系统&#xff0c;比较适合当作期末作业主要技术栈如下&#xff1a; - 数据库&#xff1a;MySQL - 开发工具&#xff1a;IDEA - 数据连接池&#xff1a;Druid - Web容器&#xff1a;Apache Tomcat - 项目管理工具&#xff1a;Maven - 版本控制工具&#xf…

elementUI中的 “this.$confirm“ 基本用法,“this.$confirm“ 调换 “确认“、“取消“ 按钮的位置

文章目录 前言具体操作总结 前言 elementUI中的 "this.$confirm" 基本用法&#xff0c;"this.$confirm" 调换 "确认"、"取消" 按钮的位置 具体操作 基本用法 <script> this.$confirm(这是数据&#xff08;res.data&#xff0…

Kafka在微服务架构中的应用:实现高效通信与数据流动

微服务架构的兴起带来了分布式系统的复杂性&#xff0c;而Kafka作为一款强大的分布式消息系统&#xff0c;为微服务之间的通信和数据流动提供了理想的解决方案。本文将深入探讨Kafka在微服务架构中的应用&#xff0c;并通过丰富的示例代码&#xff0c;帮助大家更全面地理解和应…

VMware安装Ubuntu20.04并使用Xshell连接虚拟机

文章目录 虚拟机环境准备重置虚拟网络适配器属性&#xff08;可选&#xff09;配置NAT模式的静态IP创建虚拟机虚拟机安装配置 Xshell连接虚拟机 虚拟机环境准备 VMware WorkStation Pro 17.5&#xff1a;https://customerconnect.vmware.com/cn/downloads/details?downloadGr…

unity 2d 入门 飞翔小鸟 柱子移动(十一)

c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class PoleMove : MonoBehaviour {//移动上限制public float up;//移动下限public float below;//速度private float speed;// Start is called before the first frame update…

【S32DS报错】-3-提示J-Link GDB Server failed:Device name ‘S32K344‘ not recognised错误

目录 1 Error错误提示 2 Error错误原因&#xff0c;以及如何消除Error错误 2.1 安装SEGGER J-Link 2.2 使用SEGGER J-Link的J-Flash连接MCU芯片 2.3 使用SEGGER J-Link下载程序 结尾 【S32K3_MCAL从入门到精通】合集&#xff1a; S32K3_MCAL从入门到精通https://blog.cs…

异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测

异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测 目录 异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测效果一览基本介绍模型准备模型设计参考资料效果一览 基本介绍 训练一个双向 LSTM 自动编码器来检测机器是否正常工作。 自动编码器接受…

智能优化算法应用:基于减法平均算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于减法平均算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于减法平均算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.减法平均算法4.实验参数设定5.算法结果6.参考…

【前端】CSS基础(学习笔记)

一、简介 1、HTML局限性 HTML只关注内容的语义&#xff0c;但是丑&#xff01; 2、CSS概要 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称&#xff0c;有时我们也会称之为 CSS 样式表或级联样式表。 CSS 是也是一种标记语言 CSS 主要用于设置 HTML 页面中的文本内…

进程、线程、线程池状态

线程几种状态和状态转换 进程主要写明三种基本状态&#xff1a; 线程池的几种状态&#xff1a;

Latex安装教程

目录 一、概述 二、安装Texlive语言 三、安装texstudio编译器 附录 一、概述 说一下Tex、LaTex、TexLive、Texstudio之间的区别&#xff1a; Tex&#xff1a;是一种具有编译和排版功能的基础语言&#xff0c;其作用可以直接类比 C 语言。 LaTex&#xff1a;LaTex是图灵奖…

MongoDB的删除文档、查询文档语句

本文主要介绍MongoDB的删除文档、查询文档命令语句。 目录 MongoDB删除文档MongoDB查询文档 MongoDB删除文档 MongoDB是一种基于文档的NoSQL数据库&#xff0c;它使用BSON格式存储文档。删除文档是MongoDB数据库中的常见操作之一。 下面是MongoDB删除文档的详细介绍和示例&am…

Kafka安全性探究:构建可信赖的分布式消息系统

在本文中&#xff0c;将研究Kafka的安全性&#xff0c;探讨如何确保数据在传输和存储过程中的完整性、机密性以及授权访问。通过详实的示例代码&#xff0c;全面讨论Kafka安全性的各个方面&#xff0c;从加密通信到访问控制&#xff0c;帮助大家构建一个可信赖的分布式消息系统…

Android Audio实战——音频链路分析(二十五)

在 Android 系统的开发过程当中,音频异常问题通常有如下几类:无声、调节不了声音、爆音、声音卡顿和声音效果异常(忽大忽小,低音缺失等)等。尤其声音效果这部分问题通常从日志上信息量较少,相对难定位根因。想要分析此类问题,便需要对声音传输链路有一定的了解,能够在链…

go grpc高级用法

文章目录 错误处理常规用法进阶用法原理 多路复用元数据负载均衡压缩数据 错误处理 gRPC 一般不在 message 中定义错误。毕竟每个 gRPC 服务本身就带一个 error 的返回值&#xff0c;这是用来传输错误的专用通道。gRPC 中所有的错误返回都应该是 nil 或者 由 status.Status 产…

nodejs+vue+微信小程序+python+PHP的游戏测评网站设计与实现-计算机毕业设计推荐

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将游戏测评网站功能模块主要分为管理员模块。管理员添加个人中心、管理员管理、基础数据管理、公告管理、用户管理、游戏管理、游戏测评管理、游戏攻略管理、轮播图信息等操作。  随着时代的…

轻量封装WebGPU渲染系统示例<43>- PBR材质与阴影实(源码)

原理简介: 1. 基于rendering pass graph实现。 2. WGSL Shader 基于文件系统和宏机制动态组装。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/PBRShadowTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&a…