题
我在使坐标映射按预期工作时遇到问题。由于某种原因,结果通常是关闭的,除非满足非常特定的条件。
这是一个示例场景:
对象在树中排序,每个节点为 100 像素见方。映射是从每个节点到第一个节点的父节点完成的。商品按订单排列,例如1 是 2 和 4 的父级,2 是 3 的父级,依此类推...
- Node0 在其父节点中的局部坐标为 0,0,因此从逻辑上讲,映射节点 0 的位置将返回 0,0
- 然而 Node1 不返回 100, 100,而是返回 200, 200
- Node2 和 3 的行为不同,这次值分别从之前(不正确)的节点值正确递增到 300、300 和 400、400
- Node4 返回 300, 700,尽管它仅比节点 2 低 100 个像素
- 节点5 - 200、1000
- Node6 - 300, 700 - 它低于节点 5,但显示较低的 y 值
- 节点 7 - 200、1400 - 比节点 6 低 100 像素返回 700 个额外像素 y 值
看起来这个映射并没有像我想象的那样,它会产生一个相对于被映射到的对象的绝对坐标,例如节点 0 的左上角。这应该产生预期值:
- 节点0 0, 0
- 节点1 100, 100
- 节点2 200, 200
- 节点3 300, 300
- 节点4 200、400
- 节点5 100、500
- 节点6 200、600
- 节点7 100、700
似乎每个特定水平的新孩子都会使结果产生偏差。知道这是怎么回事吗?
解决方案
经过调查后 mapToItem
我认为它不是适合这项工作的正确工具,所以我编写了自己的方法。
QPointF absolutePosition() {
QPointF p(0, 0);
QQuickItem * item = this;
while (item != Object::_rootUI) { // absolute position relative to _rootUI
p += item->position();
item = item->parentItem();
}
return p;
}
不隶属于 StackOverflow