LINUX.ORG.RU

QML и C++

 , ,


1

3

Всем привет

Есть такой класс

class ComponentCacheManager : public QObject {
    Q_OBJECT
public:
    ComponentCacheManager(QQmlEngine *engine) : engine(engine) { }

    Q_INVOKABLE void trim() { engine->clearComponentCache(); }

private:
    QQmlEngine *engine;
};

сейчас он интегрируется в qml таким образом

engine.rootContext()->setContextProperty(QStringLiteral("componentCache"), new ComponentCacheManager(&engine));

Но хотелось бы создавать его в QML когда это нужно, а значит его нужно регистрировать как QML type таким образом

qmlRegisterType<ComponentCacheManager>("ComponentCacheManager", 1, 0, "ComponentManager");

в таком случае как мне вызывать конструктор? Или если делать дефолтный конструктор пустым то как проинициализировать поле QQmlEngine *engine;


Проще всего сделать так: прокидываем в QML контекст какой-нибудь С++ объект, с единственным Q_INVOKABLE возвращающим экземпляр ComponentCacheManager инициализированный в С++ произвольным образом.

При вызове метода в QML можем сохранить полученный объект куда-нибудь в property ComponentManager componentManager.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от CrossFire

Да это вариант. По сути я сделаю фабрику объектов. Но это в любом случае обходной путь. Спасибо за совет.

Onito
() автор топика
Ответ на: комментарий от Onito

Вызывай из плюсов, инициализируй engine в дефолтном конструкторе, ну или в методе trim (не уверен, что context будет доступен на момент создания объекта). http://doc.qt.io/qt-5/qqmlengine.html#qmlEngine

fluorite ★★★★★
()
Последнее исправление: fluorite (всего исправлений: 1)
Ответ на: комментарий от fluorite

В конце-концов, можно использовать double initialization, сделать Q_INVOKABLE void initialize(), вызывать из QML в onCompleted.

fluorite ★★★★★
()

Быть может, тебе нужен qmlRegisterSingletonType а не qmlRegisterType? Там в методе уже есть указатели на QQmlEngine и QJSEngine.

wolph ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.