QGraphicsItem分组

简述

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

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

  • 简述
  • 分组方式
  • QGraphicsItemGroup
  • 示例
    • 效果
    • 源码

分组方式

分组方式有两种:

  • 通过父子关系 - 如果想要将 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处理自己的事件

时间: 2024-11-01 21:46:49

QGraphicsItem分组的相关文章

让QGraphicsItemGroup中的item处理自己的事件

简述 QGraphicsItem 分组比较简单,但在分组之后 group 中的 QGraphicsItem 无法捕获自己的相关事件(例如:鼠标事件.键盘事件),实际接受消息对象为 QGraphicsItemGroup.那么,如何处理呢? 简述 处理方式 处理方式 处理方式有两种: 方式一,也是最简单的一种: void QGraphicsItem::setHandlesChildEvents(bool enabled) 如果 enabled 为 true,QGraphicsItemGroup 将处

QGraphicsScene管理QGraphicsItem(单击/选择/移动/缩放/删除)

简述 在图形视图框架中,QGraphicsScene 提供一个快速的接口,用于管理大量 item,QGraphicsItem 是场景中 item 的基类. 图形视图提供了一些典型形状的标准 item,当然,我们也可以自定义 item.除此之外,QGraphicsItem 还支持以下特性: 鼠标按下.移动.释放和双击事件,以及鼠标悬浮事件.滚轮事件和上下文菜单事件 键盘输入焦点和键盘事件 拖放 分组:通过父子关系,或 QGraphicsItemGroup 碰撞检测 下面,一起来看看 QGraphi

Excel2013数据透视表字段分组

  先插入一个数据透视表,在[插入]选项下,点击[数据透视表] 这里选择默认的设置就好了点击确定 将种类拖入行字段,数量拖入值字段,如图所示 现在我们可以看到数据透视表已经做好了,就差分组了 选中属于蔬菜的种类,按下Ctrl见可以选择不连续的多个单元格 点击[分析]选项下的[组选择] 你会看到出现了一个新的列,在种类2这里,我们更改类别名称为蔬菜 接着,我们选择其他的种类 同样的方法我们建立数据组2,将其重命名为水果 至此,我们的字段分组就做成了 分类: Excel教程

一个根据列的范围分组汇总的Sql存储过程

1.需求说明 有如下表数据: ID NUM ----------- ----------- 1 2 2 3 3 2 4 2 5 12 6 2 7 1 8 5 9 1 10 1 11 1 输入分组参数,比如输入 "2,5,8,10" ,实现按 ID<=2,2<ID<=5,5<ID<=8,8<ID<=10,ID>10 分组查询,要得到下面的数据: groupdata num ---------- ----------- id<=2 5

mysql-求一个Mysql语句 查询出当前周的数据按照天分组

问题描述 求一个Mysql语句 查询出当前周的数据按照天分组 SELECT DATE_FORMAT(uploadTime_beg%Y-%m-%d"") as time SUM(field01) as sumStatus1 SUM(field02) as sumStatus2 SUM(field03) as sumStatus3 SUM(field04) as sumStatus4 SUM(field05) as sumStatus5 FROM health_realdata WHERE

数据-java mysql 按日期分组查询

问题描述 java mysql 按日期分组查询 如在mysql中有张表user 有三条数据 注册时间分别是是2014-11-28,2014-11-28,2014-11-29 那我要怎么分组查询出2014-11-01到2014-11-30的数据,空的也显示 要显示成 count time . . . . 0 2014-11-26 0 2014-11-27 2 2014-11-28 1 2014-11-29 0 2014-11-30 或者在java里面怎么补全 解决方案 告诉你思路,自己写,mysq

请教一个数据库分组问题

问题描述 请教一个数据库分组问题 我写了这么一个脚本 SELECT da_sp.spdm da_sp.sp da_sp.jldw da_sp.ggxh da_sp.wbdw da_sp.wbbzl da_sp.nbdw da_sp.nbbzl da_sp.cbj da_sp.zhjj da_sp.pddw da_sp.pdxs da_sp.fdyclbj da_sp.zjpsbj xs_jxcrb.spnm sum(xs_jxcrb.cksl) as cksl isnull(c.bqsl0) a

mysql聚合函数和分组

文章实例的数据表,来自上一篇博客<mysql简单查询>:http://blog.csdn.net/zuiwuyuan/article/details/39349611 一. 聚合函数 聚合函数,也叫做组合函数 求所有数据数 count不统计null ,统计的是记录数 SELECT COUNT(comm) FROM emp; # 查询emp表comm的总数 SELECT COUNT(*) FROM emp; # 查询emp表行记录的总数 SELECT COUNT(DISTINCT deptno)

微信分组发送-微信群发消息 出错,求大神

问题描述 微信群发消息 出错,求大神 请求图文消息 post的json {"filter":{"group_id":"103"},"mpnews":{"media_id":"NJdvqJn1PClTb6tFVrbnyOsLRsbIiumwvrlDO_Ty4j6OGiFQ495x- JFjFy0HKghN"},"msgtype":"mpnews"}