已经好几次,所以这次我决定询问是否有人知道发生了什么。
我有这个项目主干:
Item {
id: main
property alias rw: main.childrenRect.width
property alias rh: main.childrenRect.height
property alias rx: main.childrenRect.x
property alias ry: main.childrenRect.y
// other stuff here
Item {
Rectangle { // debugrect
width: main.rw
height: main.rh
x: main.rx
y: main.ry
color: "#00000000"
}
}
}
debugrect
作为可视调试辅助工具,请注意它是如何包装在位置0,0的另一个项目中,大小为0,0 - 这是childrenRect
中没有包含的内容主要项目。它也没有id,因此它没有被任何其他项引用。
最令人困惑的是,这个对象的存在不会导致绑定循环消息,而是从代码中删除它。出于某种原因,即使它完全与影响任何其他对象隔离,但删除它会导致其他对象中的绑定循环与其完全无关。什么可能的机制可能涉及孤立对象在绑定循环的表现中的存在?
注意:我没有包含完整的代码,因为它无关紧要。它比任何人都愿意为我调试的时间更长,我调试了它并发现它没有任何问题,问题不在于"我的代码有什么问题"但是关于qt""是什么? - 关于隔离的东西如何影响不相关的绑定或触发虚假警告。
编辑:为了消除debugrect
可能以某种方式影响main.childrenRect
的理论,我想提供此信息:
逻辑证明:debugrect
的大小由main.childrenRect
决定,因此如果它以任何方式影响它,那么 会导致绑定循环。没有这样的循环,因为没有这样的影响。包裹Item
确实影响main.childrenRect
,但是,它在位置0,0处是零大小的项目,并且它不会移动或类似的任何东西,所以有或没有它,缺席对于任何其他对象,您获得main.childrenRect
的0,0,0,0。
实践证明:
Item {
Rectangle {
width: 10
height: 10
}
Item {
Rectangle {
width: 100
height: 100
}
}
Component.onCompleted: console.log(childrenRect)
}
输出正如预期的那样:QRectF(0, 0, 10, 10)
- 内部矩形在包含在" null&#中的任何方式都不会影响外部矩形childrenRect
34;项目
此外,这并不重要,但我得到的绑定循环是关于对象,在其他来源中声明,它们都没有debugrect
的概念。
我的初步理论是,所讨论的矩形的存在与否在某种程度上影响了绑定评估树的顺序和结构(而不是实际结果)。代码非常复杂但它也可以正常运行,删除debugrect
时没有错误的行为,调试没有指出任何实际的绑定循环,只是它们的警告。有些人可能会说,大呐喊,然而这个应用程序将控制台输出重定向到用户以指示实际问题并且我无法通过虚假警告淹没它。由于绑定逻辑非常复杂,它似乎在绑定评估实现中遇到了一个弱点,并且从早期的详细测试中我已经验证了qml绑定很难以最合理或最有效的方式进行评估。解决方案是简单地将矩形留在那里,但出于好奇,我想深入了解它。
编辑2:额外信息:
debugrect
导致与完全删除它相同的行为。似乎没有这些绑定,qtquick运行时会生成警告
main.childrenRect
实际上几乎没用过。它不用于锚定任何东西,除了debugrect
之外,唯一的另一个引用,即实际的预期用途,是调整主项目所在的Flickable
的内容大小,并且为了补偿负空间中的物体,由于可光滑似乎不适用于其中的物体,因此它从0,0开始。这里的想法是主要项目扩展可滑动内容区域以容纳所有主要项目的孩子。删除预期用途参考并没有什么不同
main.childrenRect
在任何生成绑定循环警告的对象中都不以任何方式使用,无论是直接还是间接。更重要的是,有问题的对象不会影响main.childrenRect