我一直在一种“主类”中使用QQmlListProperty
,它同时是一个模型和一个qml列表属性,允许对象骨干的简单声明性标记,这可能是也可能是不可修改以及动态结构中的代码的运行时生成/合并。我在this answer中分享了一些近似值。
我对实际的实现细节一无所知,但触发我的“蜘蛛感”的是以下几点文档:
QQmlListProperty::QQmlListProperty(QObject *object, QList<T *> &list)
- 我目前正在使用的那个:
通常,此构造函数不应在生产代码中使用,因为a 可写的QList违反了QML的内存管理规则。
我实现QQmlListProperty
的原因是我想使用qtquick解析器/工厂或任何能够从常规QML代码创建模型数据的东西。当然,QQmlListProperty
API本身缺少insert和remove方法并不是任何引起关注的问题,因为预期目的不需要这样的功能,即解析代码和创建对象,因为附加就足够了。我担心的原因是“可写QList违反了QML的内存管理规则”,因为最终结果将被修改。并非附加不符合写作的要求,但我仍然担心“违反QML的内存管理规则”可能带来的负面影响。特别是objects being destroyed while still in use遇到问题之后我偶然发现了。
在一般情况下,对于通过解析QML文件创建的结构进行运行时更改似乎是可能的而不是问题,即使它有ID,例如:
Rectangle {
width: 50
height: 50
Rectangle {
id: c
width: 10
height: 10
color: "red"
}
Rectangle {
y: 20
width: 10
height: 10
color: "red"
}
Component.onCompleted: c.destroy()
}
然而在某些情况下,它确实说对象不能动态销毁或类似的东西。
因此,通过实现QQmlListProperty
并根据模糊的“可写QList违反QML内存管理规则”警告对这些结构进行更改,我可以安全地从QML文件创建对象结构吗?