在不使用ListView的情况下访问Qml中的QAbstractListModel项

时间:2014-08-05 11:46:07

标签: qt qml qabstractlistmodel

我已经将QAbstractListModel子类化,以便在qml端有一个模型。我可以在ListViews和处理模型的其他类似组件中轻松使用此模型,但是,我无法直接访问它。这就是我没有成功的尝试:

myModel[0].name // TypeError: Cannot read property 'name' of undefined

这可能吗?我使用了错误的语法吗?

3 个答案:

答案 0 :(得分:0)

(1)你正在混淆角色和属性。

您建模实现用于在视图中提供委托的角色。在您的代码中,您尝试访问属性。

(2)模型不是数组,您可以通过[]运算符访问行。

但是可以编写一个getter函数来准确归档:

class ConversationListModel : public QAbstractListModel
{
    Q_OBJECT

public:
    enum ConversationRoles {
        IdRole = Qt::UserRole, // 256
        NameRole,
    };
    explicit ConversationListModel(QObject *parent = 0);
    QHash<int, QByteArray> roleNames() const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;

    Q_INVOKABLE ConversationModel* get(quint32 conversationId) const;

signals:
    // ...

您需要一个表示行的数据类型,例如ConversationModel。现在,您可以使用

访问一行
myModel.get(0).name

如(1)所述,您现在需要为ConversationModel提供名为name

的属性
public:
    explicit ConversationModel(QObject *parent = 0);

    Q_PROPERTY(QString name READ name NOTIFY nameChanged)
    QString name() const;

答案 1 :(得分:0)

要使Simon Warta的(正确)解决方案正常工作,您必须将ConversationModel注册为QML类型。例如,在你的主要你必须陈述

qmlRegisterType<ConversationModel>("ConversationModel", 1, 0, "ConversationModel");

然后在您的qml文件中,您必须使用

导入此类型
import ConversationModel 1.0

之后一切都按预期工作,您可以使用

myModel.get(0).name
在你的qml代码中

,因为myModel的类型为ConversationListModel并且是使用QDeclarativeContext::setContextProperty注册的。

答案 2 :(得分:0)

使用DelegateModel模型作为中介器时,可以轻松访问通用模型(基于QAbstractListModel)。

import QtQuick 2.2
import QtQml.Models 2.2

DelegateModel {
  id: delegateModel
}
MyModel {
  id: myModel
  onDataLoaded: {
    delegateModel.model = myModel;
    for (var row = 0; row < myModel.rowCount(); row++) {
      var item = delegateModel.items.get(row).model;
      console.log("  name " + row + ":" + item.name);
    }
  }
}