Как изменить QML-модель на модель C ++? - PullRequest
1 голос
/ 09 марта 2020

У меня есть простая программа с QML-моделью

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.12
import QtQuick.Shapes 1.12
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    ListModel {
        id: lstmdl
        ListElement{
            name: "Arthur Morgan"
        }

        ListElement{
            name: "Dutch van der Linde"
        }

        ListElement{
            name:  "John Marston"
        }
    }

    Rectangle{
        width: parent.width / 3
        height: parent.height
        ListView{
            anchors.fill: parent
            model: lstmdl
            spacing: 9
            delegate: Text {
                text: name
            }
        }
    }
}

Как представить эту модель на C ++ и показать ее на QML. Я знаю о том, что мне нужно создать класс, который наследует QAbstractListModel и реализовать некоторые методы в этом классе. Но

  1. почему эти методы должны быть реализованы специально?

  2. Как узнать, какие методы должны быть реализованы?

  3. Что делает каждый из этих методов?

1 Ответ

2 голосов
/ 09 марта 2020

Во-первых, следует отметить, что Я знаю о том, что мне нужно создать класс, который наследует 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:


  1. Почему эти методы должны быть реализованы специально?

    Потому что, как и любой абстрактный класс: у него есть методы, которые только определяют поведение, но не реализуют его.

  2. Как узнать методы, которые должны быть реализованы?

    Это четко указано в QAbstractListModel docs , поэтому я не буду повторять это, но укажу некоторые пояснения. Если вам нужна только модель чтения, вам нужно только реализовать методы data, rowCount () и roleNames (). Если вы хотите быть редактируемыми, вы можете реализовать метод setData (). Для получения более подробной информации прочитайте документацию по классу.

  3. Что делает каждый из этих методов?

    То же, что и выше: у каждого метода есть свои полезности и логика c в документация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...