1

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

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

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

4

3 回答 3

1

(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;
于 2014-10-11T14:01:00.983 回答
1

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

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);
    }
  }
}
于 2018-08-24T23:10:30.567 回答
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注册的。

于 2017-02-21T16:24:06.987 回答