如何在QQmlListProperty属性中正确通知?

时间:2017-07-25 14:20:49

标签: c++ qml qt5 qproperty qqmllistproperty

每当我创建Q_PROPERTY以供以后在Qml中使用时,我总是创建一个通知信号来告诉qml数据已更改并需要重新评估。

现在拥有Q_PROPERTY类型的QQmlListProperty<T>我如何表示项目已被修改,添加或删除?

这甚至可能吗?

1 个答案:

答案 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会遗漏有关已更改部分的信息,因此它将完全重新创建。