关于 QGraphicsItemGroup 内部项目发生变化后group重新定位的问题


// 文件位置 qt-everywhere-src-6.7.3\qtbase\src\widgets\graphicsview\qgraphicsitem.cpp
void QGraphicsItemGroup::addToGroup(QGraphicsItem *item)
{
Q_D(QGraphicsItemGroup);
if (!item) {
qWarning("QGraphicsItemGroup::addToGroup: cannot add null item");
return;
}
if (item == this) {
qWarning("QGraphicsItemGroup::addToGroup: cannot add a group to itself");
return;
}
// COMBINE
bool ok;
QTransform itemTransform = item->itemTransform(this, &ok);
if (!ok) {
qWarning("QGraphicsItemGroup::addToGroup: could not find a valid transformation from item to group coordinates");
return;
}
QTransform newItemTransform(itemTransform);
item->setPos(mapFromItem(item, 0, 0));
// 设置父项目时会触发 itemChange() 方法
item->setParentItem(this);
// removing position from translation component of the new transform
if (!item->pos().isNull())
newItemTransform *= QTransform::fromTranslate(-item->x(), -item->y());
// removing additional transformations properties applied with itemTransform()
QPointF origin = item->transformOriginPoint();
QMatrix4x4 m;
QList<QGraphicsTransform*> transformList = item->transformations();
for (int i = 0; i < transformList.size(); ++i)
transformList.at(i)->applyTo(&m);
newItemTransform *= m.toTransform().inverted();
newItemTransform.translate(origin.x(), origin.y());
newItemTransform.rotate(-item->rotation());
newItemTransform.scale(1/item->scale(), 1/item->scale());
newItemTransform.translate(-origin.x(), -origin.y());
// ### Expensive, we could maybe use dirtySceneTransform bit for optimization
item->setTransform(newItemTransform);
item->d_func()->setIsMemberOfGroup(true);
prepareGeometryChange();
d->itemsBoundingRect |= itemTransform.mapRect(item->boundingRect() | item->childrenBoundingRect());
update();
}
void QGraphicsItem::setParentItem(QGraphicsItem *newParent)
{
if (newParent == this) {
qWarning("QGraphicsItem::setParentItem: cannot assign %p as a parent of itself", this);
return;
}
if (newParent == d_ptr->parent)
return;
const QVariant newParentVariant(itemChange(QGraphicsItem::ItemParentChange,
QVariant::fromValue<QGraphicsItem *>(newParent)));
newParent = qvariant_cast<QGraphicsItem *>(newParentVariant);
if (newParent == d_ptr->parent)
return;
const QVariant thisPointerVariant(QVariant::fromValue<QGraphicsItem *>(this));
// setParentItemHelper 内部触发 itemChange() 方法
d_ptr->setParentItemHelper(newParent, &newParentVariant, &thisPointerVariant);
}
void QGraphicsItemPrivate::setParentItemHelper(QGraphicsItem *newParent, const QVariant *newParentVariant, const QVariant *thisPointerVariant)
{
Q_Q(QGraphicsItem);
if (newParent == parent)
return;
...
if (parent) {
// Remove from current parent
parent->d_ptr->removeChild(q);
if (thisPointerVariant)
parent->itemChange(QGraphicsItem::ItemChildRemovedChange, thisPointerVariant);
}
...
// Deliver post-change notification
if (newParentVariant)
q->itemChange(QGraphicsItem::ItemParentHasChanged, *newParentVariant);
if (isObject)
emit static_cast<QGraphicsObject *>(q)->parentChanged();
}


关于 QGraphicsItemGroup 内部项目发生变化后group重新定位的问题的更多相关文章
- MyEclipse修改项目名称后,部署到tomcat问题
问题描述: 修改项目名称后,部署到tomcat server,部署出来的文件夹名还是旧的名称. 解决方案: 光把项目重命名是不够的,还要修改一下Myeclipse里面的配置. 工程名->右键-& ...
- [eclipse]改项目名称后tomcat连接问题解决方法
背景:在我们使用eclipse进行项目开发时,有时候会需要修改项目名称,当改动项目名称后发现tomcat启动访问出现问题,使用新的项目名称不可行,使用旧的项目名称却可以.修改web.xml里面的dis ...
- MyEclipse修改项目名称后,部署到 tomcat问题
问题描述: 修改项目名称后,部署到tomcat问题 解决方案: 项目->属性->myelcipse->web下,修 改web context root就可! 要在eclipse里面改 ...
- C#项目打包后安装的桌面快捷方式图标怎么设置成自己想要的图标
#项目打包后安装的桌面快捷方式图标怎么设置成自己想要的图标 2012-08-25 09:11匿名 | 浏览 3286 次 C#编程 C#项目用vs2005自带的工具打包后安装的桌面快捷方式图标怎么设 ...
- MyEclipse修改项目名称后,部署到tomcat问题。
1.问题描述: 修改项目名称后,部署到tomcat server,部署出来的文件夹名还是旧的名称. 2.解决方案: 光把项目重命名是不够的,还要修改一下Myeclipse里面的配置. a). 工程名- ...
- vue2.0 项目build后资源文件报错404的解决方案
当vue项目build后,我们会看到css.js报错404的问题: 那我们就去找错误原因吧. 首先,查看build后的dist文件目录 可以看出,js.css在index.html的同级目录下: 然后 ...
- Springboot 项目启动后执行某些自定义代码
Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRun ...
- 解决使用maven的java web项目导入后出现的有关问题 -cannot be read or is not a valid ZIP file
解决使用maven的java web项目导入后出现的有关问题 -cannot be read or is not a valid ZIP file 错误问题:虽然查找repository目录下是有 ...
- springboot 学习之路 9 (项目启动后就执行特定方法)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- vue+webpack项目打包后背景图片加载不出来问题解决
在做VUE +的WebPack脚手架项目打包完成后,在IIS服务器上运行发现项目中的背景图片加载不出来检查项目代码发现是因为CSS文件中,背景图片引用的路径问题;后来通过修改配置文件,问题终于解决了, ...
随机推荐
- 基于FPGA的按键提示音设计
1. 设计要求 按键按下,蜂鸣器要"叮"一声. 2. 设计分析 该设计方案采用野火征途MiNi FPGA开发板(intel-Cyclone IV -EP4CE10F17C8)实现, ...
- K8s Pod 资源访问控制策略
访问控制概述 Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作. 客户端 在Kuber ...
- 【iOS - 月总结】开发中遇到的小知识点(2020.02-2020.03)
由于懒癌,好久不更了,也是有一段时间没有遇到一些值得记录的问题,今天终于有空闲,就把这两个月遇到的问题总结一下. 1.xcode11中,APPdelegate没有window属性,在运行一些需要使用w ...
- 深入理解JVM内存分配机制:大对象处理、年龄判定与空间担保
---------------- 先赞后看 效果翻倍 点个关注不迷路 ------------------- 掌握Java对象在堆内存中的生命周期管理艺术 前言 Java虚拟机(JVM)的内存管理机制 ...
- Markdown语法入门一:标题,列表,表格与字体
使用编辑器:obsidian 1. 标题 标题由大到小分为六级,格式为: # + 空格 +标题内容 " # "的数量越少,等级越高 一级标题:#+空格+标题内容 二级标题:##+空 ...
- 设计方案:283-基于XILINX K7 XC7K325T的PCIe_CameraLink图像模拟源
一.板卡概述 本图像模拟源板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 .主要的功能是实 ...
- Bert基础教程-第一章节
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 小trick
基本算法 求无序数组(不可排序)的前驱和后继(比当前值小) Sol1 考虑离线使用 stack 来进行维护. 顺序遍历的时候,求的是 \(i\) 之前能否到达 \(i\),不能就标记数组 right[ ...
- [Alibaba微服务技术入门]_Nacos集群部署说明_第7讲
Nacos集群部署说明 官方网址:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 集群部署适合的环境:生产使用 部署集群环境要求: ...
- 基于AOA算术优化的KNN数据聚类算法matlab仿真
1.程序功能描述 基于AOA算术优化的KNN数据聚类算法matlab仿真.通过AOA优化算法,搜索最优的几个特征数据,进行KNN聚类,同时对比不同个数特征下的KNN聚类精度. 2.测试软件版本以及运行 ...