Я сделал подкласс QAbstractTableModel
. Теперь я хотел бы перейти к стороне QML. Все примеры, которые я нашел, раскрывают методы переопределения класса с использованием Q_INVOKABLE
, то есть data
или setData
. Можно ли передать весь объект QAbstractTableModel
как Q_INVOKABLE
? Если да, то как именно это сделать?
Передать весь QAbstractTableModel в QML
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
Спасибо за ответ. Может ли свойство быть прочитано / записано, когда дело доходит до
QAbstractTableModel
? Кроме того, это m_myTableModel.data();
вернет QVariant
. Здесь я показал весь свой класс переопределения: stackoverflow.com/ вопросы / 56434973 /
- person Łukasz Przeniosło; 04.06.2019
Вы неправильно понимаете метод data () по отношению к методу данных вашей модели! Это связано с тем, что я использовал интеллектуальный указатель для переменной-члена: doc.qt.io/ qt-5 / qscopedpointer.html # data. Вы возвращаете указатель на объект вашей модели. Затем вы можете читать, а также управлять объектом на стороне QML. Само свойство в этом случае не должно быть доступно для записи. Вы не изменяете само свойство модели, а только данные внутри объекта модели.
- person talamaki; 04.06.2019