Как представить модель C ++ в QML

Я пишу приложение QML + Qt. Я определил такой класс:

class MainClass : public QObject
{
    Q_OBJECT

public:
    rosterItemModel m_rosterItemModel;
.
.
.
}

Модель rosterItemModel - это класс, производный от QAbstractListModel. Я выставил MainClass на qml-часть, используя эту функцию:

qmlRegisterType<MainClass>("CPPIntegrate", 1, 0, "MainClass");

Теперь я хочу назначить эту модель (m_rosterItemModel) из MainClass свойству модели ListView в QML. Я пробовал следующие способы, но ни один из них не помог :(

  • Я попытался объявить m_rosterItemModel как СВОЙСТВО, используя Q_PROPERTY. Я не мог этого сделать, потому что там говорилось, что QAbstractListModel нельзя копировать.
  • Я попытался получить указатель на m_rosterItemModel в qml файле с помощью функции Q_INVOKABLE в MainClass. Но это тоже не помогло.

Кто-нибудь может мне помочь?


person s4eed    schedule 04.08.2012    source источник


Ответы (1)


Регистрации метатипа быть не должно. Все, что вам нужно, это вызвать setContextProperty и передать модель по указателю:

QQmlContext* context = view->rootContext(); //view is the QDeclarativeView
context->setContextProperty( "_rosterItemModel", &mainClassInstance->m_rosterItemModel );

Используйте его в QML:

model: _rosterItemModel

По указателю важно, поскольку объекты QObject не могут быть скопированы, и их копирование в любом случае нарушит их семантику (поскольку они имеют «идентичность»).

Альтернативой прямой регистрации модели является регистрация экземпляра вашего основного класса и использование Q_INVOKABLE. В MainClass:

Q_INVOKABLE RosterItemModel* rosterItemModel() const;

Регистрация экземпляра mainClass (снова предполагается, что mainClassInstance является указателем):

context->setContextProperty( "_mainInstance", mainClassInstance );

В QML:

model: _mainInstance.rosterItemModel()
person Frank Osterfeld    schedule 04.08.2012
comment
Я зарегистрировал MainClass в QML с помощью qmlRegisterType, чтобы легко использовать сигналы и слоты MainClass в QML, создав его экземпляр, например MainClass {id: mc}. В любом случае . Спасибо :) - person s4eed; 04.08.2012
comment
Судя по опыту, во втором случае регистрация класса модели тоже необходима: qmlRegisterType<rosterItemModel>("CPPIntegrate", 1, 0, "MainClass"); Кроме того, использование модификатора const нарушает взаимодействие. Последний необычный бит - всегда ссылаться на класс с его полной квалификацией пространства имен в объявлениях заголовка Q_PROPERTY и Q_INVOKABLE. Кроме того, если кто-то попытается вернуть указатель на какой-то базовый класс (например, QAbstractItemModel), совместимость снова потерпит неудачу, так что будьте осторожны. - person mlvljr; 05.08.2012
comment
Как получить mainClassInstance? - person Brent81; 23.02.2013
comment
Предоставить свойство из C ++ в QML - это нормально, но зачем получить указатель на m_rosterItemModel в файле qml с помощью функции Q_INVOKABLE в MainClass? - person Brent81; 23.02.2013
comment
Поскольку mainClassInstance также является QObject, почему вы также не передаете его по указателю во втором примере? - person johnbakers; 01.05.2014
comment
@OpenLearner: Фрагменты предполагают, что mainClassInstance - это MainClass*, поэтому он передается по указателю. - person Frank Osterfeld; 02.05.2014