QT Graphics-View图元组使用
通过把一个item作为另一个item的孩子,你可以得到item组的大多数本质特性:这些items会一起移动,所有变换会从父到子传递。QGraphicsItem也可以为它的孩子处理所有的事件,这样就允许以父亲代表它所有的孩子,可以有效地把所有的items看作一个整体。
另外,QGraphicsItemGroup是一个特殊的item,它既对孩子事件进行处理又有一个接口把items从一个组中增加和删除。把一个item加到 QGraphicsItemGroup仍会保留item的原始位置与变换,而给一个item重新指定父item则会让item根据其新的父亲重新定位。可以用QGraphicsScene::createItemGroup()建组。
1、通过父子关系-如果想要将 items 存储在其他 item 内,可以直接将任何 QGraphicsItem 通过为 setParentItem() 传递一个合适的 parent。
注意: 对于该方式,QGraphicsItem 可以有自己的子 item 对象。但是,QGraphicsItem 没有 API(例如:setItems()、addChild())添加孩子,它只能允许孩子附加到 parent (setParentItem()),想想也挺神奇的。
// Item parent-children
QGraphicsRectItem* pRectItemTmp = new QGraphicsRectItem(QRectF(-100.0, -100.0, 50.0, 50.0));
QGraphicsEllipseItem* pEllipseItemTmp = new QGraphicsEllipseItem(QRectF(-100.0, -100.0, 50.0, 50.0));
pEllipseItemTmp->setParentItem(pRectItemTmp);
pScene->addItem(pRectItemTmp);
pRectItemTmp->setFlag(QGraphicsItem::ItemIsSelectable);
pRectItemTmp->setFlag(QGraphicsItem::ItemIsMovable);
2、QGraphicsItemGroup(图元组)是一个容器,它的作用是将加入到该组里的图元当成一个图元来看待。QGraphicsItemGroup的父类是QGraphicsItem,所以它本质上也是一个图元,只是这个图元本身是不可见的。
QGraphicsItemGroup有两种创建方法:
一种是手动创建QGraphicsItemGroup对象然后再加入到场景中。
另一种是使用场景类的createItemGroup方法创建,该方法返回一个QGraphicsItemGroup对象。
// Item Group
// [1]
QGraphicsRectItem* pRectItem = new QGraphicsRectItem(QRectF(-30.0, -30.0, 60.0, 60.0));
QGraphicsEllipseItem* pEllipseItem = new QGraphicsEllipseItem(QRectF(-30.0, -30.0, 60.0, 60.0));
QGraphicsItemGroup* pItemGroup = new QGraphicsItemGroup();
pItemGroup->setFlag(QGraphicsItem::ItemIsSelectable);
pItemGroup->setFlag(QGraphicsItem::ItemIsMovable);
pItemGroup->addToGroup(pRectItem);
pItemGroup->addToGroup(pEllipseItem);
pScene->addItem(pItemGroup);
// [2]
QGraphicsRectItem* pRectItemEx = new QGraphicsRectItem(QRectF(-30.0, -30.0, 60.0, 60.0));
QGraphicsEllipseItem* pEllipseItemEx = new QGraphicsEllipseItem(QRectF(-30.0, -30.0, 60.0, 60.0));
QList<QGraphicsItem*> pItemList;
pItemList.append(pRectItemEx);
pItemList.append(pEllipseItemEx);
QGraphicsItemGroup* pItemGroupEx = pScene->createItemGroup(pItemList);
pItemGroupEx->setFlag(QGraphicsItem::ItemIsSelectable);
pItemGroupEx->setFlag(QGraphicsItem::ItemIsMovable);

图元组可以使用addToGroup将图元添加到组里,使用removeFromGroup将图元从组里移除。其他的操作就把它当成QGraphicsItem来看待。如果想要销毁组,可以使用场景类的destroyItemGroup方法即可。
添加和删除Item的操作保留了Item的场景相对位置和转换,相反,调用setParentItem(),其中仅保留子项目的父项相对位置和转换。
QGraphicsItem 分组比较简单,但在分组之后 group 中的 QGraphicsItem 无法捕获自己的相关事件(例如:鼠标事件、键盘事件),实际接受消息对象为 QGraphicsItemGroup。
让 QGraphicsItemGroup 中的 item 处理自己的事件
查看QGraphicsItemGroup源码
QGraphicsItemGroup::QGraphicsItemGroup(QGraphicsItem *parent)
: QGraphicsItem(*new QGraphicsItemGroupPrivate, parent)
{
setHandlesChildEvents(true);
}
setHandlesChildEvents:
This function is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
If enabled is true, this item is set to handle all events for all its children (i.e., all events intented for any of its children are instead sent to this item); otherwise, if enabled is false, this item will only handle its own events. The default value is false.
This property is useful for item groups; it allows one item to handle events on behalf of its children, as opposed to its children handling their events individually.
If a child item accepts hover events, its parent will receive hover move events as the cursor passes through the child, but it does not receive hover enter and hover leave events on behalf of its child.
QT Graphics-View图元组使用的更多相关文章
- 关于QT Graphics View开启OpenGL渲染后复选框、微调框等无法正常显示的问题
之前学习QT Graphics View框架,除了基本的图元外,还可以通过QGraphicsProxyWidget类添加QT的基本Widget(如按钮.复选框.单选框等),常使用的场景类接口如下: Q ...
- qt Graphics View Framework(非重点)
Graphics View 提供了一种接口,用于管理大量自定义的 2D 图形元素,并与之进行交互:还提供了用于将这些元素进行可视化显示的观察组件,并支持缩放和旋转. 说明;Graphics View ...
- Qt 学习之路:Graphics View Framework
Graphics View 提供了一种接口,用于管理大量自定义的 2D 图形元素,并与之进行交互:还提供了用于将这些元素进行可视化显示的观察组件,并支持缩放和旋转.我们通常所说的 Linux 的 KD ...
- Qt 学习之路 2(30):Graphics View Framework
Qt 学习之路 2(30):Graphics View Framework 豆子 2012年12月11日 Qt 学习之路 2 27条评论 Graphics View 提供了一种接口,用于管理大量自定义 ...
- Qt 之 Graphics View Framework 简介
Graphics View Framework 交互式 2D 图形的 Graphics View 框架概述.自 Qt4.2 中引入了 Graphics View,以取代其前身 QCanvas.Grap ...
- Graphics View框架
Qt4.2开始引入了Graphics View框架用来取代Qt3中的Canvas模块,并在很多地方作了改进,Graphics View框架实现了模型-视图结构的图形管理,能对大量图元进行管理,支持碰撞 ...
- Qt Model/View(官方翻译,图文并茂)
http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用mode ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- 【转】Qt Mode/View
1.view与Widget 在UI中,最常用的就是list/grid/tree了(在Qt中,grid被称为table).尤其是做那些数据库相关的程序,可能每个界面都要用到 list或grid.在Qt中 ...
随机推荐
- 【mybatis】清空数据库表数据
<update id="truncateTable"> truncate table ${tableName} </update> <update i ...
- 用ant.design的设计注意点---表单
设计的时候,输入表单项 最好放在一起,不要散落在页面各处,会导致表单项穿插存储数据,穿插验证表单,表单的样式设计要严格按照ant的版来,因为表单是交互最多最容易出错的地方,否则浪费太多工作量 持续集成 ...
- 八大排序算法总结与java实现(转)
八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...
- CPU中断的工作原理,从最底层讲起
前言 中断的概念属于硬件层.虽然我们在进行软件编程时不会直接使用中断,但理解它对我们来说依然重要. 我们在使用线程切换及状态管理.异常处理.硬件与处理器的交互.I/O操作等指令时,中断都在默默的为我们 ...
- django跨域问题解决
在django中,访问非同源网站(协议,域名,端口号)时,会出现: 解决方案: 1.安装 django-cors-headers pip install django-cors-headers 2.修 ...
- python源码解剖
print()本身就是用了多态:不同类型的对象,其实是调用了自身的print()方法 多态:动物 狗1 = new狗() 用公共的部分来指定类型,实则是调用各自的属性 创建对象有两种方式: 通过C A ...
- Qt绘制中国象棋棋盘
这里主要用的是#include <QPainter>里面的paintEvent void Board::paintEvent(QPaintEvent*) { QPainter painte ...
- ELK原理
为什么要使用Elasticsearch? 因为在我们中的数据,会随着时间变的非常多,若采用以往的模糊查询,模糊查询前置通配符,如:"%aa%",会放弃索引,导致数据表查询将变成全 ...
- TensorFlow实现文本情感分析详解
http://c.biancheng.net/view/1938.html 前面我们介绍了如何将卷积网络应用于图像.本节将把相似的想法应用于文本. 文本和图像有什么共同之处?乍一看很少.但是,如果将句 ...
- RedHat linux服务器安装elasticsearch且设置公网访问
0. 首先需要安装jdk,因为elasticsearch是Java写的,默认需要Java环境,且安装elasticsearch 7.x需要使用jdk 1.8或更高版本 1. 执行以下命令,创建elas ...