【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_OBJECTQ_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框架创建开机动画的所有内容

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

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

相关文章

目标检测——RCNN系列学习(一)

前置知识 包括&#xff1a;非极大值抑制&#xff08;NMS&#xff09;、selective search等 RCNN [1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation (arxiv.org)https://arxiv.org/abs/1311.2524 1.网络训练 2.推理流程 3.总…

第15届蓝桥STEMA测评真题剖析-2024年3月10日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第180讲。 第15届蓝桥第5次STEMA测评&#xff0c;这是2024年3月10日举办的STEMA&#xff0c;比赛仍然采取线上形式。这…

创建一个C# WinForm应用程序的步骤

创建项目界面设计设置属性编写代码保存项目运行程序 1. 新建项目 默认情况下&#xff0c;项目名称和解决方案名称是保持一致的&#xff0c;用户也可以修改成不一样的。一个解决方案下面是可以包含多个项目的&#xff0c;比如和应用程序相关的数据结构项目、一些资源等。 点击…

PhoneStatusBarView有关拖动的堆栈信息

开机&#xff1a; 拖动时的堆栈信息&#xff1a;

MoonBit 最新动态:MoonBit 引入实验性的测试覆盖率统计工具

MoonBit更新 支持 array.iter intrinsic 并且已经对标准库中的函数进行标注&#xff0c;从而可以在特定情况下将循环进行内联&#xff0c;以提升运行效率 /// intrinsic %array.iter pub fn iter[T](self : Array[T], f : (T) -> Unit) -> Unit {for i 0; i < self…

如何实现小程序滑动删除组件+全选批量删除组件

如何实现小程序滑动删除组件全选批量删除组件 一、简介 如何实现小程序滑动删除组件全选批量删除组件 采用 uni-app 实现&#xff0c;可以适用微信小程序、其他各种小程序以及 APP、Web等多个平台 具体实现步骤如下&#xff1a; 下载开发者工具 HbuilderX进入 【Dcloud 插…

代码随想录训练营day30

第七章 回溯算法part06 1.LeetCode.重新安排行程 先跳过 1.1题目链接&#xff1a; 文章讲解&#xff1a;代码随想录 1.2思路&#xff1a; 1.3附加代码如下所示&#xff1a; 2.LeetCode. N皇后 2.1题目链接&#xff1a; 文章讲解&#xff1a;代码随想录 视频讲解&#…

flutter 获取验证码倒计时组件封装

send_sms_btn.dart import dart:async;import package:flutter/material.dart; import package:get/get.dart;// 发送验证码 按钮 class SendSmsBtn extends StatefulWidget {final Future<bool> Function()? onTap;const SendSmsBtn({super.key,this.onTap,});overrid…

Mysql底层原理六:InnoDB 数据页结构

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1&#xff09;建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

P1123 取数游戏(dfs算法)

题目描述 一个 NM 的由非负整数构成的数字矩阵&#xff0c;你需要在其中取出若干个数字&#xff0c;使得取出的任意两个数字不相邻&#xff08;若一个数字在另外一个数字相邻 8个格子中的一个即认为这两个数字相邻&#xff09;&#xff0c;求取出数字和最大是多少。 输入格式 第…

ElementUI使用问题记录:设置路由+iconfont图标+自定义表单验证

一、关于导航怎么设置路由 1、在el-menu这个标签的属性中添加 router ,官方文档的解释是&#xff1a;启用vue-router 这种模式 2、在el-menu-item标签中的index属性直接书写路由&#xff0c;就可以实现正常vue-router了 3、在el-menu-item标签中书写路由属性&#xff1a;:route…

新一代最强开源UI自动化测试神器Playwright(Java版)(对话框处理)

&#x1f3ad;Playwright让网页对话框&#x1f310;&#x1f4ac;处理变得更加快捷&#xff01;网页对话框是在网页上出现的常见弹窗&#xff0c;包括Alert、Confirm和Prompt等。这些对话框通常需要用户输入信息或进行某些选择&#xff0c;但是在自动化测试中处理它们可能会很棘…