我已经将 QAbstractListModel 子类化,以便在 qml 端有一个模型。我可以在 ListViews 和其他处理模型的类似组件中轻松使用此模型,但是,我无法直接访问它。这就是我没有成功的尝试:
myModel[0].name // TypeError: Cannot read property 'name' of undefined
这可能吗?我使用了错误的语法吗?
我已经将 QAbstractListModel 子类化,以便在 qml 端有一个模型。我可以在 ListViews 和其他处理模型的类似组件中轻松使用此模型,但是,我无法直接访问它。这就是我没有成功的尝试:
myModel[0].name // TypeError: Cannot read property 'name' of undefined
这可能吗?我使用了错误的语法吗?
(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;
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);
}
}
}
要使 Simon Warta 的(正确)解决方案起作用,您必须将 ConversationModel 注册为 QML 类型。例如,在您的主要内容中,您必须声明
qmlRegisterType<ConversationModel>("ConversationModel", 1, 0, "ConversationModel");
然后在您的 qml 文件中,您必须使用
import ConversationModel 1.0
之后一切都按预期工作,您可以使用
myModel.get(0).name
在您的 qml 代码中,假设 myModel 是 ConversationListModel 类型并且是使用QDeclarativeContext::setContextProperty注册的。