Передать весь QAbstractTableModel в QML

Я сделал подкласс QAbstractTableModel. Теперь я хотел бы перейти к стороне QML. Все примеры, которые я нашел, раскрывают методы переопределения класса с использованием Q_INVOKABLE, то есть data или setData. Можно ли передать весь объект QAbstractTableModel как Q_INVOKABLE? Если да, то как именно это сделать?


person Łukasz Przeniosło    schedule 03.06.2019    source источник
comment
Вы можете передать свою модель из C ++ в QML, используя setContextProperty. Вы можете найти тысячи примеров в Интернете   -  person folibis    schedule 03.06.2019
comment
Привет, спасибо за ответ. Я знаю это и хотел бы избежать этого, поскольку с помощью этого метода я передаю только 1 глобальный объект. Моя модель представляет собой объект, который я передаю через свойство контекста   -  person Łukasz Przeniosło    schedule 03.06.2019


Ответы (1)


Q_INVOKABLE предназначен для предоставления методов производных от QObject типов в QML. Вы можете использовать Qt property system для раскрытия вашей модели QAbstractTableModel из вашего «глобального объекта», который вы сделали доступным для QML через контекст QML (как вы прокомментировали под своим вопросом).

Вы можете прочитать в документации больше о раскрытии атрибутов типов C ++ в QML < / а>.

MyTableModel, производный от QAbstractTableModel:

class MyTableModel : public QAbstractTableModel
{
    Q_OBJECT
};

MyGlobalObject, предоставляющий переменную-член MyTableModel через систему свойств:

class MyGlobalObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QAbstractTableModel* myTableModel READ myTableModel CONSTANT)
public:
    MyGlobalObject(QObject *parent = nullptr) : QObject(parent), m_myTableModel(new MyTableModel) { }
    MyTableModel *myTableModel() { return m_myTableModel.data(); }
private:
    QScopedPointer<MyTableModel> m_myTableModel;
};

Экземпляр MyGlobalObject установлен как свойство контекста в main:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    MyGlobalObject model;
    engine.rootContext()->setContextProperty("myGlobalObject", &model);
}

MyTableModel используется в качестве модели для QML TableView:

import QtQuick 2.12

TableView {
    model: myGlobalObject.myTableModel
}
person talamaki    schedule 04.06.2019
comment
Вы неправильно понимаете метод data () по отношению к методу данных вашей модели! Это связано с тем, что я использовал интеллектуальный указатель для переменной-члена: doc.qt.io/ qt-5 / qscopedpointer.html # data. Вы возвращаете указатель на объект вашей модели. Затем вы можете читать, а также управлять объектом на стороне QML. Само свойство в этом случае не должно быть доступно для записи. Вы не изменяете само свойство модели, а только данные внутри объекта модели. - person talamaki; 04.06.2019