一、简述
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 都有分组功能。下面,我们实现一个简单的分组,利用一个直线(链接线)将椭圆和矩形连接起来。
注意: QGraphicsItem 分组比较简单,但在分组之后 group 中的 QGraphicsItem 无法捕获自己的相关事件(例如:鼠标事件、键盘事件),实际接受消息对象为 QGraphicsItemGroup。
https://blog.csdn.net/weixin_34123613/article/details/90530365 https://waleon.blog.csdn.net/article/details/53510358