图形视图框架QGraphicsScene(场景,概念)
QGraphicsScene
该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用,用于在 2D 表面上可视化图形项目,例如线条、矩形、文本甚至自定义项目。
QGraphicsScene具有的功能:
- 提供用管理大量数据项的高速接口
- 传播事件到每一个图形项
- 管理图形项的状态,比如选择和处理焦点
- 提供无变换的渲染功能,主要用于打印
QGraphicsScene的函数(方法):
添加项目:
addElllipse() | 创建一个椭圆项添加到项目中 返回QGraphicsEllipseItem* |
addItem() | 添加项目,使用QGraphicsItem*添加 |
addLine() | 创建一个线段项添加到项目中 返回QGraphicsLineItem* |
addPath() | 创建一个路径项添加到项目中 返回QGraphicsPathItem* |
addPixmap() | 创建一个图片项添加到项目中 返回QGraphicsPixmapItem* |
addPolygon() | 创建一个多边形项添加到项目中 返回QGraphicsPolygonItem* |
addRect() | 创建一个矩形项添加到项目中 返回QGraphicsRectItem* |
addText() | 创建一个文本项添加到项目中 返回QGraphicsTextItem* |
addSimpleText() | 创建一个图片项添加到项目中 返回QGraphicsSimpleTextItem* |
addWidget() | 创建一个控件添加到项目中 返回QGraphicsProxyWidgetItem* |
addItem()等之后介绍QGriphicsItem时再介绍
可以直接使用除addItem()的函数来创建指定形状的项目。
#include <QApplication>
#include<QGraphicsScene>
#include<QGraphicsView>
#include<QGraphicsItem>
#include<QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;//创建一个场景
scene.setSceneRect(-200,-200,400,400);//设置矩形场景大小
//绘制圆形
QGraphicsItem* item=scene.addEllipse(QRectF(50,50,50,50),QPen(QColor(Qt::red)),QColor(Qt::lightGray));
//绘制文字
QGraphicsItem* item2=scene.addText("Text",QFont("宋体",12));
//绘制线段
QGraphicsItem* item3=scene.addLine(QLineF(0,50,100,100),QPen(QColor(Qt::blue)));
//添加控件
QPushButton *push1=new QPushButton("按键");
scene.addWidget(push1);//添加控件
QGraphicsView view;//视图,下一节会仔细介绍
view.setScene(&scene);//设置场景
view.resize(600,600);//设置视图大小
view.show();//显示
return a.exec();
}
获取项目:
itemAt() | 返回指定位置处最顶层的可见项,或者如果此位置没有项返回nullptr |
items() | 返回场景中所有项的有序列表 |
itemsBoundingRect() | 计算并返回场景中所有项的边界矩形 |
这里主要介绍一下items(),该函数有多个重载:
QList<QGraphicsItem*>QGraphicsScene::items(Qt:SortOrder)//可以设置堆叠顺序:
- Qt::AscendingOrder 项目按升序排序
- Qt::DescendingOrder 降序
QList<QGraphicsItem*>QGraphicsScene::items(const QPointF,Qt::ItemSelectionModel,Qt::SortOrder,const QTransFrom)
- 第一个参数为:点位
- 第二个参数为:指定如何选择项目
- 第三次参数为:排序
- 第四个参数为:坐标变换
其中第一个参数还可以为:QRectF,QPolygonF,QPainterPath
Qt::ItemSelectionModel
Qt::ContainsItemShape | 输出列表仅包含其形状完全包含在选择区域中的项。不包括与区域轮廓相交的项目。 |
Qt::IntersectsItemShape | 输出列表既包含其形状完全包含在选择区域内的项目,也包含与区域轮廓相交的项目。这是橡皮筋选择的常见模式。 |
Qt::ContainsItemBoundingRect | 输出列表仅包含其边框完全包含在选择区域内的项目。不包括与区域轮廓相交的项目。 |
Qt::IntersectsItemBoundingRect | 输出列表既包含其边框矩形完全包含在选择区域内的项目,也包含与区域轮廓相交的项目。此方法通常用于确定需要重绘的区域。 |
焦点、活动:
activePanel() setActivePanel() | 返回当前活动面板,返回的数据类型为:QGraphicsItem* 激活指定窗口 |
activeWindow() setActiveWindow() | 返回当前活动窗口,返回的数据类型为:QGraphicsWidget* 激活指定窗口 |
isActive() | 是否是活跃的 |
bspTreeDepth() setBspTreeDepth() | 场景的BSP索引树的深度,深度直接影响场景的性能和内存使用率;后者随着树的深度呈指数增长 |
clearFous() | 清空焦点 |
focusItem() setFocusItem() | 焦点上的项目 |
focusOnTouch setFocusOnTouch(bool) | 保存项目在接收触摸开始事件时是否获得焦点(Qt 5.12) |
hasFocus() | 场景是否拥有焦点 |
setFocus() | 设置焦点,已具有焦点,则此函数不执行任何操作 |
removeItem() | 移除项目 |
selectedItems() | 返回所有当前选定项的列表。这些项目不按特定顺序返回 |
selectionArea() setSelectionArea() | 选择区域 |
stickyFocus() setstickyFocus() | 单击场景背景是否会清除焦点 |
update(QRectF) | 更新数据 |
views() | 获取所有视图的列表 |
字体、背景和基本属性:
backgroundBrush() setBackgroundBrush() | 背景笔刷 |
font() setFont() | 字体 |
style() setStyle() | 场景样式 |
foregroundBrush() SetForeGroundBrush() | 场景的前景画笔 |
palette() setPalette() | 调色板 |
sceneRect() setSceneRect() | 场景矩形 |
height() 相当于 sceneRect().height() widget()相当于 sceneRect().widge() | 场景高度和宽度 |
minimunRenderSize() SetMinimunRenderSize() | 最小渲染大小,(Qt 5.4) 默认值为 0。如果未设置,或者设置为 0 或负值,将始终呈现所有项目。 |
reader() | 使用绘制器将源矩形从场景渲染到目标。此功能可用于将场景内容捕获到绘画设备(例如,截图)或使用 QPrinter 进行打印 |
QGraphicsScene scene;//创建一个场景
//设置矩形场景大小
scene.setSceneRect(-200,-200,400,400);
//设置字体
scene.setFont(QFont("Times", 10, QFont::Bold));
//设置背景
scene.setBackgroundBrush(QColor(255,255,0,100));
//设置前场笔刷
scene.setForegroundBrush(QBrush(QColor(20,20,20,20)));
//设置调色板
scene.setPalette(QPalette(QPalette::Shadow));
其他:
collidingItems() | 返回与项冲突的所有项的列表,一般用于碰撞 |
contextMenuEvent() | 对于事件上下文菜单事件,此事件处理程序可以在子类中重新实现以接收上下文菜单事件。 |
destroyItemGrop() | 将组中的所有项目重定父级到组的父项,然后从场景中删除组,最后将其删除。项目的位置和转换将从组映射到组的父级 |
mouseGrabberItem() | 返回当前鼠标抓取器项,或者如果当前没有项正在抓取鼠标返回true |
setItemIndexMethod() | 设置场景的索引算法 |
invalidate() | 使场景中的矩形图层重新绘制无效并计划重绘。图层中的任何缓存内容都将无条件失效并重新绘制。 |
ItemIndexMethod:
QGraphicsScene::BspTreeIndex | 应用二进制空间分区树,场景所有项目位置算法都是接近对数复杂度的量级,通过使用二进制搜索。添加、移动和删除项目是对数的。此方法最适合静态场景(即大多数项目不移动的场景)。 |
QGraphicsScene::NoIndex | 不应用任何索引项目位置具有线性复杂性,因为将搜索场景中的所有项目。但是,添加、移动和删除项目是在恒定的时间内完成的。此方法非常适合连续添加、移动或删除许多项目的动态场景。 |
SceneLayer(项目的渲染层)
QGraphicsScene::ItemLayer | 项目图层,通过调用虚拟函数 drawItems() 来渲染此层中的所有项目。项目图层在背景图层之后绘制,但在前景图层之前绘制。 |
QGraphicsScene::BackgroundLayer | 背景图层,通过调用虚拟函数 drawBackground() 在此层中渲染场景的背景。首先绘制所有图层的背景图层。 |
QGraphicsScene::ForegroundLayer | 前景图层,通过调用虚拟函数 drowForeground() 在此层中渲染场景的前景。前景图层是所有图层的最后一个绘制的。 |
QGraphicsScene::AllLayers | 所有层;此值表示所有三个图层的组合。 |
公共插槽:
advance() | 将场景进一步推进,这分两个阶段完成:在第一阶段,通知所有项目场景即将更改,在第二阶段,所有项目都会收到它们可以移动的通知。用于动画 |
clear() | 从场景中移除和删除所有项目,但保持场景状态不变 |
clearSelection() | 清除当前所选内容 |
invalidate() | 使场景中的矩形图层重新绘制无效并计划重绘。图层中的任何缓存内容都将无条件失效并重新绘制。 |
update(QRectF) | 计划在场景中重绘区域直角 |
信号:
changed() | 如果场景内容发生更改时,触发信号 |
foucusItemChanged() | 焦点发生变化时,触发信号 |
sceneRectChanged() | 景矩形发生变化时,触出信号 |
selectionChanged() | 每当选择更改时,触发信号 |
QGraphicsScene的使用方法:
- QGraphicsScene 没有自己的视觉外观;它仅管理项目,需要创建一个QGraphicsView来显示可视化场景
- QGraphicsScene最大的优势之一是它能够有效地确定物品的位置。即使场景中有数百万个项目,items() 函数也可以在几毫秒内确定项目的位置。
这里就不具体介绍使用方法,使用方法会在QGraphicsView和QGraphicsItem中主要介绍。
参考资料:
QGraphicsScene Class | Qt Widgets 5.15.13