QGraphicsItem分组

简介: 简述QGraphicsItem 支持很多特性,例如:鼠标、键盘事件、拖放、分组、碰撞检测等。通常在演示工具中使用分组,当用户想要将多个较小的 items 组合成一个大的 item 时,以简化 items 的移动和复制。简述分组方式QGraphicsItemGroup示例效果源码分组方式分组方式有两种:通过父子关系 -

简述

QGraphicsItem 支持很多特性,例如:鼠标、键盘事件、拖放、分组、碰撞检测等。

通常在演示工具中使用分组,当用户想要将多个较小的 items 组合成一个大的 item 时,以简化 items 的移动和复制。

分组方式

分组方式有两种:

  • 通过父子关系 - 如果想要将 items 存储在其他 item 内,可以直接将任何 QGraphicsItem 通过为 setParentItem() 传递一个合适的 parent。

  • QGraphicsItemGroup - 提供了一个容器,将一组 items 视为单个 item。

注意: 对于方式一,QGraphicsItem 可以有自己的子 item 对象。但是,QGraphicsItem 没有 API(例如:setItems()、addChild())添加孩子,它只能允许孩子附加到 parent (setParentItem()),想想也挺神奇的。

QGraphicsItemGroup

QGraphicsItemGroup 是一种特殊类型的复合 item,将自身及其所有子项视为一个 item(即,其所有子项的所有事件和几何图形都被合并在一起)。

QGraphicsItemGroup 的 boundingRect() 函数返回位于其中所有 items 的边界矩形。QGraphicsItemGroup 忽略其子项上的 ItemIgnoresTransformations 标记(即,相对于 QGraphicsItemGroup 的 geometry,子项被视为可变换的)。

要构造一个 QGraphicsItemGroup,有两种方式:

  • 将一个 items 列表(例如:所有选择的 items)传递给 QGraphicsScene::createItemGroup(),它返回一个新的 QGraphicsItemGroup(最简单、最常见的方式)。

  • 手动构造一个 QGraphicsItemGroup,使用 QGraphicsScene::addItem() 将其添加到场景中,然后通过调用 addToGroup() 为 group 手动添加 item,一次只能添加一个。

要拆卸(取消组合)一个 QGraphicsItemGroup,可以调用 QGraphicsScene::destroyItemGroup(),也可以通过调用 removeFromGroup() 从 group 中手动删除所有 items。

// 将所有选定的 items 组合在一起
QGraphicsItemGroup *group = scene->createItemGroup(scene->selecteditems());

// 销毁 group,并删除 group item
scene->destroyItemGroup(group);

示例

常用的软件,例如:XMind、Visio 都有分组功能。下面,我们实现一个简单的分组,利用一个直线(链接线)将椭圆和矩形连接起来。

效果

这里写图片描述

源码

// 构造 group、椭圆、直线、矩形
QGraphicsItemGroup *pGroup = new QGraphicsItemGroup();
QGraphicsEllipseItem *pFrom = new QGraphicsEllipseItem();
QGraphicsLineItem *pLink = new QGraphicsLineItem();
QGraphicsRectItem *pTo = new QGraphicsRectItem();

// 设置 group 可选中、可移动
pGroup->setFlags( QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);

// 设置样式(画笔 - 边框色 画刷 - 背景色)
QPen pen = pFrom->pen();
pen.setWidth(2);
pen.setColor(QColor(0, 160, 230));
pFrom->setPen(pen);
pLink->setPen(pen);
pTo->setPen(pen);
pFrom->setBrush(QColor(247, 160, 57));
pTo->setBrush(QColor(247, 160, 57));

// 将 item 添加至 group
pGroup->addToGroup(pFrom);
pGroup->addToGroup(pTo);
pGroup->addToGroup(pLink);

// 设置椭圆、矩形区域
const double length = 50;
pFrom->setRect(QRectF(-length/2.0, -length/2.0, length, length));
pTo->setRect(QRectF(-length/2.0, -length/2.0, length, length));

// 设置椭圆、矩形、连接线坐标
pFrom->setPos(80, 80);
pTo->setPos(200, 150);
pLink->setLine(QLineF(pFrom->pos(), pTo->pos()));

// 将 group 添加至场景中
QGraphicsScene *pScene = new QGraphicsScene();
pScene->setSceneRect(0, 0, 300, 200);
pScene->addItem(pGroup);

// 为视图设置场景
QGraphicsView *pView = new QGraphicsView();
pView->setRenderHint(QPainter::Antialiasing);
pView->setScene(pScene);
pView->show();

注意: QGraphicsItem 分组比较简单,但在分组之后 group 中的 QGraphicsItem 无法捕获自己的相关事件(例如:鼠标事件、键盘事件),实际接受消息对象为 QGraphicsItemGroup。处理方式请参见:让QGraphicsItemGroup中的item处理自己的事件

目录
相关文章
|
JavaScript 前端开发
49jqGrid 分组 - 分组行折叠
49jqGrid 分组 - 分组行折叠
49 0
|
JSON JavaScript 前端开发
78jqGrid - 列分组
78jqGrid - 列分组
39 0
|
JavaScript 前端开发
47jqGrid 分组 - 分组表头行配置
47jqGrid 分组 - 分组表头行配置
74 0
|
JavaScript 前端开发
46jqGrid 分组 - 隐藏分组列
46jqGrid 分组 - 隐藏分组列
37 0
|
JavaScript 前端开发
45jqGrid 分组 - 数组数据的简单分组
45jqGrid 分组 - 数组数据的简单分组
42 0
Qt模型视图框架——列表视图
Qt模型视图框架——列表视图
C#编程-77:DataGridView绘制行序号
C#编程-77:DataGridView绘制行序号
260 0
C#编程-77:DataGridView绘制行序号
自定义QGraphicsItem
简述 QGraphicsItem 是场景中 item 的基类。图形视图提供了一些典型形状的标准 item,例如:矩形 ( QGraphicsRectItem )、椭圆 ( QGraphicsEllipseItem ) 、文本项 ( QGraphicsTextItem )。当这些不满足需求时(例如:在一些复杂的工作流场景中),往往需要自定义,通常的做法就是继承 QGraphi
3261 1
QGraphicsScene管理QGraphicsItem(单击/选择/移动/缩放/删除)
简述 在图形视图框架中,QGraphicsScene 提供一个快速的接口,用于管理大量 item,QGraphicsItem 是场景中 item 的基类。 图形视图提供了一些典型形状的标准 item,当然,我们也可以自定义 item。除此之外,QGraphicsItem 还支持以下特性: 鼠标按下、移动、释放和双击事件,以及鼠标悬浮事件、滚轮事件和上下文菜单事件 键盘
11770 1