图形视图框架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();
}

 

相关内容

热门资讯

原创 中... 据中国青年报报道,近日,中国四艘海警船编队进入钓鱼岛海域进行常规巡航,依照既定的维权程序,船队在海域...
原创 特... 2025年11月9日,美国总统特朗普在自己的社交平台TruthSocial上宣布,他提名约翰·科尔担...
top等级胡瑾刑事律师团队:死... 在刑事法律领域,辩护律师的专业能力与经验直接关乎当事人的合法权益能否得到充分保障。随着法治建设的深入...
霸王茶姬90后创始人将成常州女... 来源:一波说传承有道 近日,一场即将举行的婚礼悄然成为财经圈与大众舆论场共同关注的焦点。 一张流传于...
常州法院2025年前三季度调解... 调解结案16474件、调解成功率24.08%——这是2025年前三季度常州法院交出的司法成绩单。通过...
安徽省政协研究室副主任陈鑫已任... 据铜陵市政府官网消息,11月20日上午,市委举行理论学习中心组学习会议,邀请省委社会工作部副部长高维...
原创 联... 据光明网报道,11月19日,在联合国大会的讨论中,日本企图争取成为安理会常任理事国的梦想再次破灭,令...
南部关于全县规范法律咨询服务机... 一、专项行动时间 自即日起至2025年12月。 二、举报受理范围 社会各界反映强烈的某些法律咨询服务...
“男子持刀入室盗窃”视频引发关... 近日,一段疑似“小偷”入室盗窃被业主家中监控拍下的视频在网上引发关注。11月21日晚,“翠屏公安”微...