> 文章列表 > 图形视图框架QGraphicsItem(项,概念)

图形视图框架QGraphicsItem(项,概念)

图形视图框架QGraphicsItem(项,概念)

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<QGraphicsItem>
#include<QPainter>
#include<QGraphicsScene>
#include<QGraphicsView>
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();
}

 

生活知识百科