从QAbstractListModel继承的列表模型,列表项属性不会从QML更新

时间:2013-01-07 21:40:16

标签: qml qt-quick qt5

我很难解释我的问题,所以我只是想让它变得简单并希望它能够完成这项工作。我正在使用Qt5和QtQuick 2.0。

我创建了一个继承自QAbstractListModel的MyListModel类,并保存了MyListItem类型的项目。我在QML ListView中将它用作model: myListModel,并且委托在可爱的TextInput框中显示来自MyListItem的quantity属性。一切正常。

但是,当我从委托中更改quantity值时,模型中的项目不会更新。我知道他们没有更新,因为我的setQuantity(long desired_quantity)函数,MyListItem的成员,没有运行。长话短说,我无法弄清楚如何从委托中实际调用setQuantity函数。我可以手动将Q_PROPERTY(long quantity READ quantity WRITE setQuantity)添加到MyListItem,然后使用setContextProperty()MyListItem myTemp对象公开给QML,然后调用myTemp.quantity = 10。但很明显,如果代理人不能写入数量属性(它只能从中读取),那么它就无法完成工作。

有人能指出我正确的方向吗?我觉得我已经尝试过Qt设计师可能期望的一切,但我什么都没得到。而且我找不到任何明确解决我的问题的文件。

1 个答案:

答案 0 :(得分:3)

TextInput框不会自动更新您的c ++模型,您必须自己完成。您可以通过向模型添加插槽或Q_INVOKABLE方法来执行此操作:

//add a slot to you model
public slots:
 setDataInModel(const int index, const QVariant &value);
//or add Q_INVOKABLE method:
public:
 Q_INVOKABLE setData(const int index, const QVariant &value);

您必须实现其中一种方法,以便更改模型中的相应数据行。不要忘记在更新后调用方法内的 dataChanged 方法。然后,在更新TextInput时,必须手动从QML委托调用这些方法:

onAccepted: {
  model.setDataInModel(index, text)
}

此处索引是在每个委托中定义的属性,text是TextInput中的文本。