Во-первых, следует отметить, что Я знаю о том, что мне нужно создать класс, который наследует QAbstractListModel и реализует некоторые методы в этом классе. false, нет необходимости создавать новый класс, который наследует из QAbstractListModel, например, то же самое можно реализовать на основе QStandardItemModel:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QStandardItemModel>
enum CustomRoles{
NameRole = Qt::UserRole + 1000
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QStandardItemModel model;
model.setItemRoleNames({{CustomRoles::NameRole, "name"}});
for(const QString & name: {"Arthur Morgan", "Dutch van der Linde", "John Marston"}){
QStandardItem *item = new QStandardItem;
item->setData(name, CustomRoles::NameRole);
model.appendRow(item);
}
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("lstmdl", &model);
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Rectangle{
width: parent.width / 3
height: parent.height
ListView{
anchors.fill: parent
model: lstmdl
spacing: 9
delegate: Text {
text: name
}
}
}
}
Примечание: С другой стороны, Qt предоставляет документацию и примеры того, как использовать модели C ++ в QML:
Почему эти методы должны быть реализованы специально?
Потому что, как и любой абстрактный класс: у него есть методы, которые только определяют поведение, но не реализуют его.
Как узнать методы, которые должны быть реализованы?
Это четко указано в QAbstractListModel docs , поэтому я не буду повторять это, но укажу некоторые пояснения. Если вам нужна только модель чтения, вам нужно только реализовать методы data, rowCount () и roleNames (). Если вы хотите быть редактируемыми, вы можете реализовать метод setData (). Для получения более подробной информации прочитайте документацию по классу.
Что делает каждый из этих методов?
То же, что и выше: у каждого метода есть свои полезности и логика c в документация.