Hello
I have some problems to get my qml to work with a QAbstractListModel.
Here is my code:
Data.h
#ifndef DATA_H
#define DATA_H
#include <QAbstractListModel>
#include <QApplication>
#include <QDebug>
#include <QHash>
#include <QList>
#include <QObject>
#include <QVariant>
#include <QVariantMap>
class Data : public QAbstractListModel
{
Q_OBJECT
protected:
Data(QObject *parent);
private:
enum Role
{
Role_Name = Qt::UserRole + 1,
Role_Age
};
public:
static Data* instance();
private:
QHash<int, QByteArray> mRoleNames;
QList<QVariantMap> mItems;
public:
virtual QHash<int, QByteArray> roleNames() const;
virtual QVariant data(const QModelIndex &index, int role) const;
virtual int rowCount(const QModelIndex &) const;
};
#endif // DATA_H
Data.cpp
#include "Data.h"
Data::Data(QObject *parent)
: QAbstractListModel(parent)
{
mRoleNames[Role_Name] = "name";
mRoleNames[Role_Age] = "age";
for (int i = 0; i < 10; ++i)
{
QVariantMap item;
item[mRoleNames[Role_Name]] = QString("Name %1").arg(i);
item[mRoleNames[Role_Age]] = i;
mItems << item;
}
}
Data *Data::instance()
{
static Data *p = new Data(qApp);
return p;
}
QHash<int, QByteArray> Data::roleNames() const
{
return mRoleNames;
}
QVariant Data::data(const QModelIndex &index, int role) const
{
Q_ASSERT(index.isValid());
if ((role >= Role_Name) && (role <= Role_Age))
{
return mItems[index.row()][mRoleNames[role]];
}
return QVariant();
}
int Data::rowCount(const QModelIndex &) const
{
return mItems.count();
}
main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "Data.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("data", Data::instance());
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
main.qml
import QtQuick 2.2
import QtQuick.Controls 1.1
ApplicationWindow {
visible: true
width: 300
height: 300
title: qsTr("Hello World")
ListView {
anchors.fill: parent
model: data
delegate: Text {
text: name + ", " + age
}
}
}
When i run the application i get this message:
QQmlExpression: Expression qrc:///main.qml:68:16 depends on non-NOTIFYable properties: QQuickListView::data
Also i see that no one methods of the Data class, except instance(), are called.
What is wrong with my code?
↧