【QT学习】Graphics View框架(进阶篇)- 派生QGraphicsItem类创建自定义图元item

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


前言

   在上一篇《Graphics View框架(基础篇)- 图元、场景、视图》中,我们对图元、场景和视图进行了简单的介绍,并使用这个三个类的组合,在窗口中绘制一个矩形图元。
   本篇,我们将通过对QGraphicsItem类进行派生,创建自定义图元item并显示在窗口中。我们将以创建一张从文件读取的图片item为例进行分析。


一、实现效果

在这里插入图片描述

二、实现流程

1.创建继承基类QGraphicsItem的派生类myItem

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.重新配置生成的头文件

(1)在类中添加头文件QGraphicsItem

  在这里插入图片描述
(2)重写生成的customItem类

  在这里插入图片描述

  在这里插入图片描述
(3)重写后的customItem类

  在这里插入图片描述

重写customItem类:使其继承QObject类,这样才能在该类中使用connect函数连接信号和槽。

(4)重新执行qmake(重要!重要!重要!),否则编译会报错error: undefined reference to `vtable for

  在这里插入图片描述

3.在类中使用QPixmap创建图片对象并加载

在这里插入图片描述

在这里插入图片描述

4.重写基类QGraphicsItem的两个纯虚函数

在这里插入图片描述

在这里插入图片描述

  • 纯虚函数QRectF boundingRect() const:自定义图元边界,计算图元轮廓的垂直边界最小矩形。
  • 纯虚函数void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR):绘制需要显示的图像。在该实例中,我们需要对加载后的图片进行绘制。

5.在main函数中定义,并显示自定义图元

在这里插入图片描述

三、完整源码

1.main.cpp文件

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

#include <QGraphicsItem>	//图元
#include <QGraphicsScene>	//场景
#include <QGraphicsView>	//视图
#include <customItem.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    //创建视图
    QGraphicsView *view = new QGraphicsView();
    //创建场景
    QGraphicsScene *scene = new QGraphicsScene();
    //创建自定义图元项
    customItem *item = new customItem();
    //将场景添加到视图中
    view->setScene(scene);
    //将图元添加到场景中
    scene->addItem(item);
    //设置窗口大小
    view->resize(350,350);
    //窗口显示
    view->show();
    
    return a.exec();
}

2.customItem.h文件

#ifndef CUSTOMITEM_H
#define CUSTOMITEM_H

#include <QGraphicsItem>
#include <QPixmap>

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

#endif // CUSTOMITEM_H

3.customItem.cpp文件

#include <QPainter>
#include "customitem.h"

customItem::customItem()
{
    this->picture.load("./picture/search.png");
}

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

void customItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->drawPixmap(0,0,this->picture);
}

总结

   以上就是Graphics View框架(进阶篇)- 派生QGraphicsItem类创建自定义图元item的所有内容,后续还有Graphics View框架(高阶篇):使用Graphics View框架创建开机动画
   原创不易,转载请标明出处,希望大家阅读后都能有所收获!若文章出现有误之处,欢迎读者留言指正批评!

在这里插入图片描述

  • 12
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Qt QGraphicsView是一个框架,用于在Qt应用程序中创建交互式2D图形界面。它提供了一个容器,用于显示和编辑Qt QGraphicsItem的场景,Qt QGraphicsItem是可以在场景中绘制的图元QGraphicsItem是QGraphicsView的一个子,它表示场景中的一个可视化的对象。可以使用QGraphicsView创建自定义图元。 以下是创建自定义图元的基本步骤: 1.创建一个自定义,该继承自QGraphicsItem。 2.实现paint()函数,该函数用于在场景中绘制图元。 3.实现boundingRect()函数,该函数用于确定图元的边界框。 4.实现shape()函数,该函数用于定义图元的形状。 5.将自定义图元添加到场景中。 以下是一个简单的自定义图元的例子: ```c++ class MyItem : public QGraphicsItem { public: MyItem(); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); QPainterPath shape() const; }; MyItem::MyItem() { setFlag(ItemIsMovable); } QRectF MyItem::boundingRect() const { return QRectF(-10, -10, 20, 20); } void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->setPen(Qt::NoPen); painter->setBrush(Qt::red); painter->drawEllipse(-10, -10, 20, 20); } QPainterPath MyItem::shape() const { QPainterPath path; path.addEllipse(-10, -10, 20, 20); return path; } ``` 在主函数中,创建场景和视图,并将自定义图元添加到场景中: ```c++ int main(int argc, char *argv[]) { QApplication a(argc, argv); QGraphicsScene scene; QGraphicsView view(&scene); MyItem *item = new MyItem; scene.addItem(item); view.show(); return a.exec(); } ``` 这将创建一个红色的圆形图元,可以拖动它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孤生i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值