首页 文章

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

提问于
浏览
1

我很难解释我的问题,所以我只是想让它变得简单并希望它能完成这项工作 . 我正在使用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 回答

  • 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中的文本 .

相关问题