QGraphicsItem分组
通常在演示工具中使用分组,当用户想要将多个较小的 items 组合成一个大的 item 时,以简化 items 的移动和复制。
通过父子关系 - 如果想要将 items 存储在其他 item 内,可以直接将任何 QGraphicsItem 通过为 setParentItem() 传递一个合适的 parent。
QGraphicsItemGroup - 提供了一个容器,将一组 items 视为单个 item。
注意: 对于方式一,QGraphicsItem 可以有自己的子 item 对象。但是,QGraphicsItem 没有 API(例如:setItems()、addChild())添加孩子,它只能允许孩子附加到 parent (setParentItem()),想想也挺神奇的。
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处理自己的事件。
自定义控件详解(六):Paint 画笔MaskFilter过滤 首先看一个API:setMaskFilter(MaskFilter maskfilter): 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等。 以下有两个MaskFilter的子类可供选择: BlurMaskFilter:指定了一个模糊的样式和半径来处理Paint的边缘。
在 Scene 中添加 QGraphicsItem 后,当选中该 item 时,会看到边缘区域出现虚线,感觉不太美观。下面,我们来讲解如何去掉虚线并自定义选中样式。
在图形视图框架中,QGraphicsScene 提供一个快速的接口,用于管理大量 item,QGraphicsItem 是场景中 item 的基类。 图形视图提供了一些典型形状的标准 item,当然,我们也可以自定义 item。除此之外,QGraphicsItem 还支持以下特性:
QGraphicsItem 是场景中 item 的基类。图形视图提供了一些典型形状的标准 item,例如:矩形 ( QGraphicsRectItem )、椭圆 ( QGraphicsEllipseItem ) 、文本项 ( QGraphicsTextItem )。当这些不满足需求时(例如:在一些复杂的工作流场景中),往往需要自定义,通常的做法就是继承 QGraphi
相关文章
- linq lambda 分组后排序
- 76jqGrid - 分组行
- Navicat 查询创建工具 | 设置分组准则 - Part 5
- 活动分组 码蹄集
- 记一次生产Slor分组的bug
- mysql数据查询 4.分组查询
- 数据科学必备Pandas数据分组GroupBy方法汇总
- Excel 数据透视表教程大全之 04 按日期分组(教程含样本数据)
- mysql 分组统计、排序、取前N条记录解决方案
- 小程序开发笔记(八)—Js数组按日期分组显示数据
- 大规模数据存储集群数据存放的设计,分布式shardid的生成 - 如何指定范围随机数, 分组随机数
- 浅析Java8新特性-Stream流操作:Stream概念、常见中间/终止操作符、创建stream的3种方式、串行流/并行流的区分、使用示例(遍历/匹配、过滤、聚合、映射、归约、归集、统计、分区分组、接合、排序、组合/提取、分页、并行、集合转Map、使用并行流注意点)
- SQL数据分组后取最大值或者取前几个值(依照某一列排序)
- sql server 以10分钟分组 统计人数
- 学习python第四天——Oracle分组
- 分组密码的工作模式--wiki
- [Pandas] groupby分组聚合操作