每当我创建Q_PROPERTY
以供以后在Qml中使用时,我总是创建一个通知信号来告诉qml数据已更改并需要重新评估。
现在拥有Q_PROPERTY
类型的QQmlListProperty<T>
我如何表示项目已被修改,添加或删除?
这甚至可能吗?
答案 0 :(得分:2)
如果您有一个列表,则不能成为void addLego(int depth, int height, int width) {
posLegoX = 0.0f;
posLegoZ = -50.0f;//set the values here so when the function will be
//called, the position of the first Lego will be always
//the same
int i = 0;
int j = 0;
for(i=0 ; i<depth ; i++) { //multiply basic Lego to get the right depth
posLegoX += 7.8f; //incrementing global variable wich change the
//basic position of the current Lego in the above
//function
setLego(height); //creating the current basic Lego
}
for(j=0 ; j<width ; j++) { //multiply basic Lego to get the right depth
posLegoZ -= 7.8; //decrementing global variable wich change the
//basic position of the current Lego in the above
//function
setLego(height); //creating the current basic Lego
}
}
信号,因为存储的对象引用将保持不变。
在列表中不会有属性,因此不会发出信号。
您可以使用QAbstractListModel
的后代来设计处理此问题,方法是将方法包装在自己的方法中追加,插入等,然后发出一个propertyChanged()
信号找到变化所需的信息。
当然,你可以通过将dataChanged
包装在另一个对象中来实现类似的东西,该对象有一个信号通知你数据的变化。然而,这不能很好地与QML集成为真实模型,因为至少视图会在收到QList
信号时自动更新,并且它们甚至只更新必要的内容。
不是这样,如果dataChanged
的{{1}}直接更改(如果您手动调用model
)。在这种情况下,View
会遗漏有关已更改部分的信息,因此它将完全重新创建。