图形视图框架QGraphicsItem(项,概念)
创始人
2025-05-30 17:06:07
0

QGraphicsItem(图形项)

QGraphicsItem时QGraphicsScene中所有图形项的基类。

在QGraphicsItem中含有编写自己的自定义项提供了轻量级基础,包括通过其事件处理程序定义项的几何图形、碰撞检测、其绘制实现和项的交互。

标准的图形项目:

  • QGraphicsEllipseItem    椭圆形项目

  • QGraphicsLineItem     行项目
  • QGraphicsPathItem    路径项目
  • QGraphicsPixmapItem  图片项目
  • QGraphicsPloygonItem  多边形项目
  • QGraphicsRectItem  矩形项目
  • QGraphicsSimpleTextItem  文本标签项
  • QGraphicsTextItem  简单的文本浏览器项

标准的图形项目:

int main(int argc, char *argv[])
{QApplication a(argc, argv);QGraphicsScene scene(-200,-200,400,400);//创建一个场景QGraphicsEllipseItem item1(0,0,100,100);//创建一个圆item1.setPos(-50,-50);//设置位置scene.addItem(&item1);QGraphicsLineItem item2(0,0,150,150);//创建一个线段scene.addItem(&item2);QGraphicsRectItem item3(-100,-100,100,100);//创建一个矩形scene.addItem(&item3);QGraphicsTextItem item4("Text");//创建一个文本内容scene.addItem(&item4);QGraphicsView view2;//创建第一个视图view2.setScene(&scene);//设置场景view2.show();//显示return a.exec();
}

自定义一个图形项:

首先需要继承QGraphicsItem,必须重写 boundingRect() 和paint()函数,如果图形为非矩形的话,还需要再重写一下shape()函数

  • boundingRect()返回要绘制图形项的矩形区域,所有绘画都必须限制在项目的边界内
  • paint()用来绘制图形项
  • shape()用来更精准的描述图形的区域,以便更好地进行碰撞检测。

 例如:创建一个c++项目,名为MyItem

MyItem.h文件:

#define MYITEM_H#include
#include
#include
#include
class MyItem: public QGraphicsItem //继承QGraphicsItem
{
public:MyItem();QRectF boundingRect() const;//重写图形项的矩形区域该函数void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);//重写绘画函数QPainterPath shape() const ;//重写形状private:int radius=50;//圆的半径int x=-10;//圆的x轴坐标int y=-10;//圆的y轴坐标};#endif // MYITEM_H

 MyItem.cpp文件:

#include "myitem.h"MyItem::MyItem()
{}QRectF MyItem::boundingRect() const//重写该函数
{qreal penwidth=1;//笔的宽度return QRectF(x-penwidth/2,y-penwidth/2,radius+penwidth,radius+penwidth);
}
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)//重写绘画函数
{painter->setBrush(QColor(Qt::blue));painter->drawEllipse(x,y,radius,radius);
}
QPainterPath MyItem::shape() const //重写形状
{QPainterPath P;P.addEllipse(-10,-10,50,50);//把圆的具体参数写上return P;
}

在main函数中添加:

int main(int argc, char *argv[])
{QApplication a(argc, argv);QGraphicsScene scene(-200,-200,400,400);//创建一个场景MyItem *item=new MyItem;//创建一个自定义项目scene.addItem(item);//添加到场景中QGraphicsView view2;//创建第一个视图view2.setScene(&scene);//设置场景view2.show();//显示return a.exec();
}

在这里解释一下 boundingRect()函数:

QRectF MyItem::boundingRect() const//重写该函数
{qreal penwidth=1;//笔的宽度return QRectF(x-penwidth/2,y-penwidth/2,radius+penwidth,radius+penwidth);
}圆的圆心为:x,y
圆的半径为:radius
当在QPainter中指定QPen来渲染图形界面边界轮廓时,绘制的图形的边界的一半会在外面,一般会在里面,所以在boundingRect()中需要包含半个画笔宽度的原因。

QGraphicsItem在场景中的位置:

pos()返回项在父坐标中的位置。如果项目没有父项,则以场景坐标给出其位置
moveBy(x,y)水平移动x,竖直移动y
setPos()设置位置
int main(int argc, char *argv[])
{QApplication a(argc, argv);QGraphicsScene scene(-200,-200,400,400);//创建一个场景QGraphicsEllipseItem item1(0,0,100,100);//创建一个圆item1.setPos(-50,-50);//设置位置item1.moveBy(100,200);//移动位置 x+100;y+200scene.addItem(&item1);QGraphicsView view2;//创建第一个视图view2.setScene(&scene);//设置场景view2.resize(400,400);view2.show();//显示return a.exec();
}

 

相关内容

热门资讯

【Java学习笔记】38.Ja... Java 发送邮件 使用Java应用程序发送 E-mail 十分简单,但是首先你应该在...
从一个Spring动态代理Bu... 文章目录Bug复现结论@PostConstruct的在Bean的生命周期的哪一步一般代理类的...
Java函数式编程 概念:面向对象思想关注用什么对象完成什么事情。而函数式编程思想就类似数学中的函数。它关...
Redis KV如何存储 一、KV如何存储? 为了实现从键到值的快速访问,Redis 使用了一个哈...
Java if else分支结... Java 支持两种选择语句:if 语句和 switch 语句。其中 if 语句使用布尔...
与会人士高度评价国际调解院 点... 与会人士高度评价国际调解院 点赞国际法治领域创新之举 新华社香港5月30日电 题:与会人士高度评价...
还在stream中使用peek... 文章目录简介peek的定义和基本使用peek的流式处理Stream的懒执行策略peek为什么只被推荐...
C++析构函数详解 创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会...
Apache Paimon 二、典型实践应用 2.1)离线数仓加速 离线数仓加速可以说是一个非常典型的应用场景了 ...
“内鬼”李卓勋,任上被查 据“清廉龙江”5月30日消息,黑龙江省哈尔滨市纪委监委第九审查调查室主任李卓勋涉嫌严重违纪违法,目前...