我很难解释我的问题,所以我只是想让它变得简单并希望它能够完成这项工作。我正在使用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设计师可能期望的一切,但我什么都没得到。而且我找不到任何明确解决我的问题的文件。
答案 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中的文本。