列表模型继承自QAbstractListModel,列表项属性赢得';t从QML更新

列表模型继承自QAbstractListModel,列表项属性赢得';t从QML更新,qml,qt-quick,qt5,Qml,Qt Quick,Qt5,我很难解释我的问题,所以我只想简单一点,希望它能解决问题。我正在使用Qt5和QtQuick 2.0 我创建了一个MyListModel类,该类继承自QAbstractListModel,并保存MyListItem类型的项。我在QML列表视图中将其用作模型:myListModel,并且该代理在一个可爱的文本输入框中显示MyListItem中的数量属性。一切正常 但是,当我从代理更改数量值时,模型中的项目不会更新。我知道它们没有更新,因为MyListItem的成员mysetQuantity(long

我很难解释我的问题,所以我只想简单一点,希望它能解决问题。我正在使用Qt5和QtQuick 2.0

我创建了一个MyListModel类,该类继承自QAbstractListModel,并保存MyListItem类型的项。我在QML列表视图中将其用作
模型:myListModel
,并且该代理在一个可爱的文本输入框中显示MyListItem中的
数量
属性。一切正常

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


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

< P>文本输入框不会自动更新你的C++模型,你必须自己做。您可以通过向模型中添加一个slot或Q_可调用方法来实现这一点:

//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)
}

这里的索引是在每个委托中定义的属性,文本是来自TextInput的文本。

有效。您是否对委托不只是对列表对象(而不仅仅是索引)进行预先引用的原因有任何意见?因为为了让QSortFilterProxyModel对象在我使用的模型上运行,我必须对QSortFilterProxyModel进行子类化,并将
modifyQuantity()
函数传递回原始模型,对不对?代理仅在收到诸如dataChanged之类的信号时才从模型读取数据。因此,它们通常不需要对列表对象的引用。一种解决方案是向模型中添加一个额外的角色,该角色返回每个项目的唯一编号。然后,您可以在调用模型更改函数而不是索引时使用它。那么你就不必对QSortFilterProxyModel进行子类化了。这个想法唯一的问题是在模型中搜索唯一id所需的时间,对吗?在我的情况下,这可能会很好,但我会不好意思走捷径。编辑:我走了捷径。它工作得很好。该死的你鼓励懒惰!(说真的,谢谢你的见解!)