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

  • 📢欢迎各位读者:点赞 👍 收藏 ⭐留言 📝
  • 📢博客主页:https://blog.csdn.net/qq_59134387😀
  • 📢原创不易,转载请标明出处;如有错误,敬请指正批评!💦
  • 📢我不去想是否能够成功,既然选择了远方,便只顾风雨兼程!✨


前言

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


一、实现效果

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

在这里插入图片描述

二、实现流程

1.准备工作

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

2.图片切换

  
    //设置图片路径,图片切换
    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.图片显示


//继承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框架创建开机动画的所有内容,希望大家阅读后都能有所收获!
   原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤生i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值