我已经将QAbstractListModel子类化,以便在qml端有一个模型。我可以在ListViews和处理模型的其他类似组件中轻松使用此模型,但是,我无法直接访问它。这就是我没有成功的尝试:
myModel[0].name // TypeError: Cannot read property 'name' of undefined
这可能吗?我使用了错误的语法吗?
答案 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);
}
}
}