Передать весь QAbstractTableModel в QML - PullRequest
0 голосов
/ 03 июня 2019

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

1 Ответ

2 голосов
/ 04 июня 2019

Q_INVOKABLE предназначен для предоставления методов QML для производных типов QObject.Вы можете использовать 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
}
...