QT 如何在QPushButton上播放gif(终极版)

在平时浏览网站,或者使用软件的时候,经常可以见到:在点击了某个按钮之后,按钮上会显示动图以及提示文字。在QT中,比较常见且简单的做法就是:给按钮设置一个layout,然后在这个layout里面添加QLabel(作为QMovie的载体),以及用于显示文字的QLabel。该方案可参考:https://blog.csdn.net/hellokandy/article/details/120043562

但本文将采取另外一种方式(编写一个用于播放Gif 的QPushButton类)来实现,原生的按钮只要提升为该类即可。

1、效果图

在这里插入图片描述

2、GifPushButton

1、GifPushButton.h

#ifndef GIFPUSHBUTTON_H
#define GIFPUSHBUTTON_H
#include <QWidget>
#include <QPushButton>class QMovie;
class GifPushButton : public QPushButton
{Q_OBJECT
public:explicit GifPushButton(QWidget *parent = nullptr);~GifPushButton(){}//void SetMovie(const QString &fileName);void SetMovie(QMovie *movie);QMovie *GetMovie() const;//void Start();void Stop();//
signals:void movieChanged();protected:void showEvent(QShowEvent *event) override;void hideEvent(QHideEvent *event) override;private slots:void OnFrameChanged(int frameNumber);
private:QMovie *m_movie = nullptr;bool m_movieResized = false;
};#endif // GIFPUSHBUTTON_H

2、GifPushButton.cpp

#include "gifpushbutton.h"
#include <QMovie>
#include <QDebug>GifPushButton::GifPushButton(QWidget *parent): QPushButton(parent), m_movie(nullptr)
{}void GifPushButton::SetMovie(const QString &fileName)
{auto movie = new QMovie(this);movie->setFileName(fileName);SetMovie(movie);
}void GifPushButton::SetMovie(QMovie *movie)
{if(!movie){return;}if(movie == m_movie){return;}if(m_movie){m_movie->stop();disconnect(movie, &QMovie::frameChanged, this, &GifPushButton::OnFrameChanged);}if(movie->parent() != this){movie->setParent(this);}movie->jumpToFrame(0);m_movie = movie;connect(movie, &QMovie::frameChanged, this, &GifPushButton::OnFrameChanged);connect(movie, &QMovie::destroyed, this, [](QObject *object){Q_UNUSED(object);qDebug() << "movie destroyed";});//emit movieChanged();
}QMovie *GifPushButton::GetMovie() const
{return m_movie;
}void GifPushButton::Start()
{if(m_movie){m_movie->start();}
}void GifPushButton::Stop()
{if(m_movie){m_movie->stop();setIcon(QIcon());}
}void GifPushButton::showEvent(QShowEvent *event)
{if(m_movie){m_movie->start();}//GifPushButton::showEvent(event);
}void GifPushButton::hideEvent(QHideEvent *event)
{if(m_movie){m_movie->stop();}//GifPushButton::hideEvent(event);
}void GifPushButton::OnFrameChanged(int frameNumber)
{if(!m_movie){return;}if(!m_movieResized){int len = qMin(width(), height());QSize sz = QSize(len, len);m_movie->setScaledSize(sz);QRect rect = m_movie->frameRect();//m_movieResized = true;qDebug() << sz << rect.size();}QPixmap pix = m_movie->currentPixmap();setIcon(QIcon(pix));
}

3、如何使用

#include "maindialog.h"
#include "ui_maindialog.h"MainDialog::MainDialog(QWidget *parent): QDialog(parent), ui(new Ui::MainDialog)
{ui->setupUi(this);//ui->button_loading->setFixedSize(150, 36);ui->button_downloading->setFixedSize(150, 36);ui->button_dancing->setFixedSize(150, 36);//ui->button_loading->SetMovie(":/image/loading.gif");ui->button_downloading->SetMovie(":/image/downloading.gif");ui->button_dancing->SetMovie(":/image/dancing.gif");//from qss styleui->button_loading->setProperty("button_type", "120x48");
}MainDialog::~MainDialog()
{delete ui;
}void MainDialog::on_button_start_clicked()
{ui->button_loading->Start();
}void MainDialog::on_button_stop_clicked()
{ui->button_loading->Stop();
}

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

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

相关文章

百度飞桨大模型训练营:人工智能与大语言模型

1 人工智能基础概念全景介绍 1.1 人工智能概念 解释这些概念 AI是计算机学科下的一个分支学科&#xff0c;旨在使用计算机使之能像人类一样学习和思考问题机器学习是AI的一个子集&#xff0c;它的一个重要特点就是不需要人去做显示编程&#xff08;不用手撕函数&#xff09;&…

性能测试什么时候开始?性能测试流程介绍

性能测试什么时候开始? 一般在系统功能稳定没有大的缺陷之后开始执行。但前期准备工作可以从系统需求分析时就开始&#xff1a;性能目标制定、场景获取、环境申请等。 一、制定性能测试目标 在特定的并发用户数下测试特定场景的响应时间 在一定的响应时间的要求下来测试特…

STM32的IAP讲解

stm32系列芯片的种类和型号 汇编文件种类型号startup_stm32f10x_cl.s互联型的器件STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s大容量STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_hd_vl.s大容量STM32F100xxstartup_stm32f10x_ld.s小容量STM32F101xx,STM32F10…

进程等待详解

一、进程等待的作用 我们都知道&#xff0c;当子进程已经结束而父进程还在执行时&#xff0c;子进程会变成僵尸进程&#xff0c;造成内存泄漏等问题&#xff0c;如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include &l…

【包邮送书】ARM汇编与逆向工程

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

被问了N遍的效率工具!批量自动添加好友

你还在手动输入客户号码或是微信号&#xff0c;再逐一进行搜索和添加吗&#xff1f; 现在有一个工具可以帮助你完成这项重复枯燥的工作任务&#xff0c;而且&#xff0c;这个工具不仅能够帮助你批量添加微信好友&#xff0c;更有很多自动化的功能&#xff0c;让你的办公效率得…

14028.malloc堆内存泄漏问题

文章目录 1 模拟堆内存不断增长的场景使用vmstat查看内存变化情况使用valgrind 的memcheck输出日志1 模拟堆内存不断增长的场景 #include <stdio.h> #include <unistd.h> #include <stdint.h> #

在Java中如何判断素数

目录 一、试除法 二、埃氏筛选法 三、欧拉筛选法 一、试除法 素数的定义&#xff1a;只能被1和自己的整除的正整数。注&#xff1a;1不是素数&#xff0c;最小素数是2判断一个数n是不是素数&#xff0c;当你<10^14&#xff0c;用试除法&#xff1b;当n>10^14&#xff…

【华为OD机试】去重求和【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给定一个数组,编写一个函数, 计算他的最大N个数和最小N个数的和, 需要对数组进行去重。 输入描述 第一行输入M,M表示数组大小 第二行输入M个数,表示数组内容 第三行输入N表示需要计算…

Comparable接口详解

Comparable接口是Java中的一个接口&#xff0c;用于定义对象的自然排序方式。实现Comparable接口的类必须定义compareTo方法&#xff0c;该方法用于比较当前对象与另一个对象的大小。这种比较机制允许对象数组或集合通过如Arrays.sort()或Collections.sort()等工具类进行自然排…

第二证券|AIGC行业新突破不断 文化传媒板块活跃

本周以来&#xff0c;以短剧、游戏为代表的文明传媒板块实现三连涨。3月13日&#xff0c;游戏股逆势大涨&#xff0c;游戏出海、网络游戏、短剧游戏方向领涨。到收盘&#xff0c;因赛集团以20%幅度涨停&#xff0c;掌趣科技涨超10%&#xff0c;凯撒文明、中广天择、时代出书、大…

【Datawhale组队学习:Sora原理与技术实战】训练一个 sora 模型的准备工作,video caption 和算力评估

训练 Sora 模型 在 Sora 的技术报告中&#xff0c;Sora 使用视频压缩网络将各种大小的视频压缩为潜在空间中的时空 patches sequence&#xff0c;然后使用 Diffusion Transformer 进行去噪&#xff0c;最后解码生成视频。 Open-Sora 在下图中总结了 Sora 可能使用的训练流程。…

Django之Cookie

Django之Cookie 目录 Django之Cookie介绍Django操作Cookie设置Cookie浏览器查看Cookie 获取Cookie设置超时Cookie注销Cookie 模拟登录验证登录验证装饰器登录验证装饰器-升级版 介绍 当我们上网使用社交媒体或者购物时&#xff0c;浏览器需要通过一种方式来记住我们。想象一下…

Spring boot java: 无效的目标发行版: 18

idea 搭建spring boot 报错java: 无效的目标发行版: 18 本人jdk 1.8 解决方案如下&#xff1a;

雅思写作整理

常用单词 sufficient adj.充足的->sufficiently adv. bullet n.黑点 tone n.基调 consistent adj.始终如一的 adequately adv.足够地&#xff1b;适当地 recount v.说明 mechanically adv.机械地 tendency n.偏好&#xff1b;趋势 confuse v.使迷惑&#xff1b;混淆 barely…

学点Java打小工_Day4_数组_冒泡排序

1 数组基本概念 程序算法数据结构 算法&#xff1a;解决程序的流程步骤 数据结构&#xff1a;将数据按照某种特定的结构来存储 设计良好的数据结构会导致良好的算法。 ArrayList、LinkedList 数组是最简单的数据结构。 数组&#xff1a;存放同一种类型数据的集合&#xff0c;在…

VGG网络的代码实现

VGG网络的程序实现完全根据配置表来实现。 全连接层之前的部分属于特征提取部分&#xff0c;后三部分全连接层用来分类。 1、模型 import torch.nn as nn import torch# official pretrain weights #预训练的权重下载地址 model_urls {vgg11: https://download.pytorch.org/…

电子科技大学链时代工作室招新题C语言部分---题号E

1. 题目 这道题大概的意思是说&#xff0c;一座城市中被埋了许多雷&#xff08;用一个只含0和1的字符串表示城市&#xff0c;1代表有雷&#xff0c;0代表无雷&#xff09;。 你作为一个排雷兵&#xff0c;需要花最少的钱引爆所有的雷来使城市中不再有雷&#xff08;太逆天了&a…

信创产品操作系统加固配置解决方案

1 口令策略配置方面,未设置口令生存周期(高)、未设置口令更改最小间隔天数(高)、未设置口令最小长度(高)、未设置口令复杂度策略(高)、未设置密码重复使用次数限制(中)。 1.1 口令策略未设置口令生存周期(高) 解决方法: 全局设置: 在/etc/login.defs中添加:PAS…

软件工程师,是时候了解下Rust编程语言了

背景 2024年年初&#xff0c;美国政府发布了一份网络安全报告&#xff0c;呼吁软件开发人员停止使用容易出现内存安全漏洞的编程语言&#xff0c;比如&#xff1a;C和C&#xff0c;转而使用内存安全的编程语言。这份报告由美国网络空间总监办公室 (ONCD) 发布&#xff0c;旨在落…