【发布时间】:2017-05-10 12:45:30
【问题描述】:
我有一个奇怪的问题,它隐藏在一个大型项目的某个地方。到目前为止,我无法在 MCVE 中重现它,但一旦成功,我就会将其提交。
这是一个非常简单的错误行为。基本上我有一个带有属性的QtObject,我使用初始值设置如下:
TestObj.qml
QtObject {
id: root
property int val1: { console.log('set val', root); return 42 }
Component.onCompleted: console.log('Constructed Object', this)
}
!!! 在这个例子中,我不会重现错误 !!!
我的项目中的输出现在是:
set val TestObj_QMLTYPE_44(0x33799fa8)set val TestObj_QMLTYPE_44(0x33799fa8)Constructed Object TestObj_QMLTYPE_44(0x33799fa8)
因此,虽然对象只创建了一次,但初始属性分配执行了两次。
由于我不知道在哪里寻找罪魁祸首,我无法提供可重现的示例,但也许有人已经偶然发现了同样的情况并找到了解决方案。
解决方案将是有益的,因为此问题会导致某些对象的多个实例化,而我无法销毁。
【问题讨论】:
-
如果在属性绑定中给对象一个
id,然后是print(objectId),你会得到什么输出?还有QML_DISABLE_DISK_CACHE=1的建议,它在过去有问题时会有所帮助(虽然我不知道什么时候引入的)。 -
有效问题。我相应地编辑了问题。
-
QML_DISABLE_DISK_CACHE=1应该在 JIT 开始生成.qmlc-files 时在qt5.8中引入 -
我认为我的发现更适合 answer-部分而不是 question-部分,尽管问题仍然存在,是否存在比提出的 4 种糟糕的解决方法更好的解决方案。