1

我很难解释我的问题,所以我只是让它变得简单,并希望它能完成工作。我将 Qt5 与 QtQuick 2.0 一起使用。

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

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

有人可以指出我正确的方向吗?我觉得我已经尝试了 Qt 设计师可能期望的一切,但我一无所获。而且我找不到任何可以明确解决我的问题的文档。

4

1 回答 1

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

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

于 2013-01-08T08:57:25.983 回答