【QT学习】Graphics View框架(高阶篇)- 使用Graphics View框架创建开机动画

【QT学习】Graphics View框架(高阶篇)- 使用Graphics View框架创建开机动画_qgraphicsview 一步-CSDN博客

 前言

在上一篇《Graphics View框架(进阶篇)- 派生QGraphicsItem类创建自定义图元item》中,我们介绍了创建自定义图元的具体流程,通过继承基类QGraphicsItem,重写基类的两个纯虚函数来计算自定义的图元轮廓的最小矩形并进行图元绘制。
本篇,我们将对图元、场景和视图进行综合运用,使用Graphics View框架创建一个开机动画。

一、实现效果

运行程序后出现开机动画,开机动画结束后进入程序主界面,如下图所示。

二、实现流程

1.准备工作

  • 首先,我们需要先准备好一段开机动画视频。由于图元无法以视频的形式播放,我们需要先将视频转成图片,再对图片进行逐一切换加载到自定义图元中,最后达到开机动画播放的目的。
  • 我们可以用视频 -> GIF动图 -> n帧图片的方式,将开机视频分解成n张图片。如下图所示,我将开机动画视频分解成40帧图片。

2.图片切换

  • 这里我们需要用到自定义的图元类(自定义图元类的用法,请阅读《Graphics View框架(进阶篇)- 派生QGraphicsItem类创建自定义图元item》),我们在该类中重写paint绘制函数,代码如下。
  
    //设置图片路径,图片切换
    QString path = "./picture/开机动画/p"+QString::number(this->count)+".png";
    //切换到下一张图片
    this->count++;
    //加载图片
    this->picture.load(path);
    //延时函数,解决开机动画播放过快问题
    for(int i=0;i<9000;i++)
    {
        for(int j=0;j<10000;j++);
    }
    //绘制图片
    painter->drawPixmap(0-this->picture.width()/2,0-this->picture.height()/2,this->picture.width(),this->picture.height(),this->picture);
    //自动刷新paint函数
    this->update();
    

我准备的40帧图片是以p1~p40命名,所以我们在更改图片路径时,只需要更改图片名称对应的数字即可。

 3.图片显示

我们采用《Graphics View框架(基础篇)- 图元、场景、视图》所介绍的,先将图元添加到场景中,再将场景设置到视图中去显示的方法,代码如下。


//继承GraphicsView类的自定义视图类的构造函数
myView::myView()
{
	//设置窗口尺寸
    this->setFixedSize(640,346);

    //设置圆角边框
    QBitmap bmp(this->size());
    bmp.fill();
    QPainter painter(&bmp);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::black);
    painter.drawRoundedRect(bmp.rect(),40,40);
    this->setMask(bmp);

	//添加文字并设置文字样式
    QLabel *title = new QLabel("iQIYI爱奇艺",this);
    title->setGeometry(250,265,180,50);
    title->setStyleSheet("QLabel{font-size:30px;font-style:微软雅黑;font-weight:bold}");
    
    //创建自定义图元
	this->item = new myItem();
	//设置图元坐标
    this->item->setPos(316,170);
	//创建场景
    this->scene = new QGraphicsScene(0,0,630,340);
    //将自定义图元添加到场景中
    this->scene->addItem(item);
    //将场景设置到视图中
    this->setScene(scene);
}

三、完整源码

1.main.cpp文件

#include "widget.h"
#include <QApplication>
#include "myview.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    myView *view = new myView();						//创建自定义视图
    view->setWindowFlags(Qt::FramelessWindowHint);		//去掉窗口标题栏
    view->setAttribute(Qt::WA_TranslucentBackground);	//窗口透明化
    view->show();										//窗口显示
    
    return a.exec();
}

2.myitem.h文件

#ifndef MYITEM_H
#define MYITEM_H

#include <QPixmap>
#include <QGraphicsItem>

class myItem : public QObject,public QGraphicsItem
{
    Q_OBJECT
    Q_INTERFACES(QGraphicsItem)
public:
    myItem();
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR);
    virtual ~myItem() {}
    QPixmap picture;
    int count;
signals:
public slots:
};

#endif // MYITEM_H

3.myitem.cpp文件

#include <QLabel>
#include <QPainter>
#include "myitem.h"

myItem::myItem()
{
	this->count = 1;
    QString path = "./picture/开机动画/p"+QString::number(this->count)+".png";
    this->picture.load(path);
    this->count++;
}

QRectF myItem::boundingRect() const
{
    return QRectF(0-this->picture.width()/2,0-this->picture.height()/2,this->picture.width(),this->picture.height());
}

void myItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    //设置图片路径,图片切换
    QString path = "./picture/开机动画/p"+QString::number(this->count)+".png";
    //重复播放
    if(this->count == 40)
    {
  		this->count = 1;
    }
    //切换到下一张图片
    this->count++;
    //加载图片
    this->picture.load(path);
    //延时函数,解决开机动画播放过快问题
    for(int i=0;i<9000;i++)
    {
        for(int j=0;j<10000;j++);
    }
    //绘制图片
    painter->drawPixmap(0-this->picture.width()/2,0-this->picture.height()/2,this->picture.width(),this->picture.height(),this->picture);
    //自动刷新paint函数
    this->update();
}

4.myview.h文件

#ifndef MYVIEW_H
#define MYVIEW_H

#include <QGraphicsView>
#include <QGraphicsScene>
#include "myitem.h"

class myView : public QGraphicsView
{
    Q_OBJECT
public:
    myView();
    myItem *item;
    QGraphicsScene *scene;
    virtual ~myView() {}
};

#endif // MYVIEW_H

5.myview.cpp文件

#include <QLabel>
#include <QBitmap>
#include <QPainter>
#include "myview.h"

myView::myView()
{
	//设置窗口尺寸
    this->setFixedSize(640,346);

    //设置圆角边框
    QBitmap bmp(this->size());
    bmp.fill();
    QPainter painter(&bmp);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::black);
    painter.drawRoundedRect(bmp.rect(),40,40);
    this->setMask(bmp);

	//添加文字并设置文字样式
    QLabel *title = new QLabel("iQIYI爱奇艺",this);
    title->setGeometry(250,265,180,50);
    title->setStyleSheet("QLabel{font-size:30px;font-style:微软雅黑;font-weight:bold}");
    
    //创建自定义图元
	this->item = new myItem();
	//设置图元坐标
    this->item->setPos(316,170);
	//创建场景
    this->scene = new QGraphicsScene(0,0,630,340);
    //将自定义图元添加到场景中
    this->scene->addItem(item);
    //将场景设置到视图中
    this->setScene(scene);
}

总结

以上就是Graphics View框架(高阶篇):使用Graphics View框架创建开机动画的所有内容

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

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

相关文章

助力AIGC暴雨推出4卡液冷图站TR770

2022年&#xff0c;ChatGPT横空出世&#xff0c;正式拉开了生成式人工智能&#xff08;AIGC&#xff09;的序幕&#xff1b;2024年&#xff0c;Sora惊艳亮相&#xff0c;再度将AIGC技术推向高潮&#xff0c;引发了全球范围内的新一轮科技竞赛与创新热潮。从文字创作的灵感迸发&…

图像处理环境配置opencv-python

下载python&#xff0c;配置pip使用清华源下载镜像&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 切换到python目录下&#xff0c;右击cmd&#xff0c;执行pip升级指令: python -m pip install --upgrade pip 下载opencv&#x…

“鲜花换冥币,文明寄哀思“张家口慈善义工联合会清明节活动

又是一年春草绿&#xff0c;梨花风起正清明。扫墓祭祖、缅怀先人是清明节的重要民俗活动&#xff0c;为摒弃传统陋习&#xff0c;树文明祭祀新风&#xff0c;2024年4月4日&#xff0c;张家口慈善义工联合会携手市人民公墓西祥园组织志愿者们开展以“鲜花换冥币&#xff0c;文明…

windows下使用的的数字取证工作工具套装:forensictools

推荐一套windows下使用的的数字取证工作工具套装&#xff1a;forensictools 部分工具包括&#xff1a; ▫️exiftool&#xff0c;一个命令行应用程序和 Perl 库&#xff0c;用于读写元信息。 ▫️YARA&#xff0c;一款开源工具&#xff0c;用于对恶意软件样本进行识别和分类。…

开源区块链系统/技术 总结(欢迎补充,最新)

1. FISCO BCOS FISCO BCOS 2.0 技术文档 — FISCO BCOS 2.0 v2.9.0 文档https://fisco-bcos-documentation.readthedocs.io/ 2. ChainMaker&#xff08;长安链&#xff09; 文档导航 — chainmaker-docs v2.3.2 documentationhttps://docs.chainmaker.org.cn/v2.3.2/html/in…

移动机器人运动规划 | 基于图搜索的Dijkstra 和 A*算法详解

Dijkstra 算法 Dijkstra 算法与BFS算法的区别就是 : 从容器中弹出接下来要访问的节点的规则不同 BFS 弹出: 层级最浅的原则&#xff0c;队列里最下方的元素 Dijkstra 弹出: 代价最小的节点g(n) g(n) :表示的是从开始节点到当前n节点的代价累加 Dijkstra在扩展的时候&#x…

深度挖掘商品信息,jd.item_get API助您呈现商品全面规格参数

深度挖掘商品信息&#xff0c;特别是在电商平台上&#xff0c;对于商家、开发者和用户来说都至关重要。jd.item_get API作为京东开放平台提供的一个强大工具&#xff0c;能够帮助用户轻松获取商品的全面规格参数&#xff0c;进而为商品分析、推荐、比较等提供有力的数据支撑。 …

arm64 - 系统调用

起因 群里做网络的小伙伴问了一个问题&#xff0c;他在wifi驱动的某个函数里加了dump stack&#xff0c;然后插入驱动&#xff0c;发现调用栈是这样的&#xff0c;为什么呢&#xff1f; 代码追溯 insmod这个app&#xff0c;是在busybox中的&#xff0c;所以找到busybox的代…

大话设计模式——13.外观模式(Facade Pattern)

简介 又称门面模式&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 UML图 应用场景&#xff1a; 第三方SDK大多使用该模式&#xff0c;通过一个外观类&#xff0c;可对用户屏蔽…

蓝桥杯DFS-最大数字

解题思路 我们从最高位开始要利用自己的1号操作和2号操作保证当前这个数位的数一定要尽可能最大。 然后分别考虑两种操作&#xff0c;首先两种操作不可能混用&#xff0c;因为它们是抵消的效果&#xff0c;所以要么对这个数全使用1操作&#xff0c;要么2操作。假设某个数位的…

easyexcel处理复杂表头

需求&#xff0c;模板如下 功能如下 开始整活&#xff0c;依赖包。 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>下载导入模板 1.方法 GetMapping…

详解FB广告三种受众类型,提升广告投放精准度

在Facebook广告中&#xff0c;精确地定位潜在客户至关重要。然而&#xff0c;达到完美精准度通常是一个逐渐逼近的过程&#xff0c;涉及到多次迭代和细化目标人群。Facebook提供了三种主要的受众类型&#xff1a;核心受众(Core Audiences)、自定义受众(Custom Audiences)和类似…

携手博鳌亚洲论坛,五粮液“以和美,敬世界”

执笔 | 尼 奥 编辑 | 扬 灵 3月26-29日&#xff0c;以“亚洲与世界&#xff1a;共同的挑战 共同的责任”为主题的博鳌亚洲论坛2024年年会在海南博鳌盛大召开&#xff0c;聚集全球政商学媒等各国代表汇聚一堂&#xff0c;围绕投资亚洲未来、减少贸易碎片化、加速迈向零碳电…

朗汀留学美国生物医学工程专业留学部分录取案例合集

满怀期待的憧憬与金榜题名的喜悦交织着未来的掌声&#xff0c;捧在手心里的不仅仅是一份一份努力浇灌的录取通知&#xff0c;更是一起拼搏走过的岁月沉淀。 我们感恩每一位朗汀留学的学生和家长&#xff0c;是你们的支持与信任&#xff0c;让我们有机会共享此刻的荣耀&#xff…

初涉 VS Code 插件开发

官方文档&#xff1a;Extension API | Visual Studio Code Extension API 实战记录 从hello word&#xff01;开撕 根据文档开始创建插件 Your First Extension | Visual Studio Code Extension API 全局安装Yeoman工具 npm install --global yo generator-code 使用Yeom…

nginx 配置访问地址和解决跨域问题(反向代理)

1、配置访问地址&#xff08;通过ip访问&#xff09; //配置ip访问地址 location ^~/auditApp{alias /usr/local/front-apps/cbd/auditApp;index index.html;if (!-e $request_filename) {rewrite ^/(.*) /auditApp/index.html last;break;}} 2、解决跨域问题&…

二叉树后序遍历算法多种实现傻傻分不清楚

致力于C、C、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享。 若作品对您有帮助&#xff0c;请关注、分享、点赞、收藏、在看、喜欢。您的支持是我们为您提供帮助的最大动力。 1.介绍 二叉树的后序遍历是一种遍历二叉树的策略&#…

运行v3+ts+vite+eslint碰到的问题集合

1、问题&#xff1a;提示Missing semicolon semi&#xff08;缺少分号&#xff09; 解决&#xff1a;对比其他ts代码&#xff0c;发现在orderDetail后少了分号&#xff0c;加上去之后就可以了。好严格&#xff01;&#xff01;&#xff01; 2、问题&#xff1a;The template…

idea开发 java web 疫情信息查询系统bootstrap框架web结构java编程计算机网页接口查询

一、源码特点 java 疫情信息查询系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 css j…

PP-Structure 文档分析

本文接着上一篇文章&#xff1a;PaddleOCR环境搭建、模型训练、推理、部署全流程&#xff08;Ubuntu系统&#xff09;-CSDN博客 主要包括以下几种&#xff1a; PP-Structure 文档分析 --官方地址 1.1版面分析和表格识别1.2版面恢复1.3关键信息抽取 1. 简介 PP-Structu…