Как узнать экземпляр QQmlEngine одноэлементного объекта?

У меня есть класс SingletonBaseClass это определено в C++ и позже расширено в QML. В файле qmldir он помечен как синглтон:

// qmldir file
singleton SingletonClass 1.0 SingletonClass.qml

// SingletonClass.qml
import QtQml 2.0
pragma Singleton
SingletonBaseClass {
    // ...
}

Это базовый класс:

class SingletonBaseClass : public QObject 
{
    Q_OBJECT
    public:
    SingletonBaseClass(QObject* parent = nullptr) {}

    // Get the owner engine
    Q_INVOKABLE void someMethodCalledFromQml()
    {
        QQmlEngine* ownerEngine = ?
    }

    // Get the single instance of the given engine
    static SingletonBaseClass* instance(QQmlEngine* engine)
    {
        SingletonBaseClass* instance = ?
        return instance;
    } 

};
  1. Как я могу получить QQmlEngine экземпляр в SingletonBaseClass?
  2. Как я могу получить указатель на мой экземпляр singleton из статической функции?

Примечание. В моем приложении несколько экземпляров механизма QML.

[Обновление]: я не был удовлетворен предлагаемыми обходными путями, поэтому я наконец-то добавил этот патч для 1. и QQmlEngine::singletonInstance() для 2. Оба изменения будут доступны в Qt 5.12.

1 ответ

Решение

Если вы хотите получить QQmlEngine Вы можете использовать contextForObject() метод, как я покажу ниже:

Q_INVOKABLE void someMethodCalledFromQml()
{
    QQmlEngine *ownerEngine = QQmlEngine::contextForObject(this)->engine();
    qDebug()<<ownerEngine;
}

у синглетонов в qml нет родителя, поэтому способ получить к ним доступ - создать свойство, для этого мы создаем.qml и создаем объект с таким свойством, как Singleton:

QRC:/tmp.qml

import QtQuick 2.0

QtObject {
    property var obj: SingletonClass
}

и затем к этому элементу получают доступ следующий код:

static SingletonBaseClass* instance(QQmlEngine* engine)
{
    QQmlComponent component(engine, QUrl("qrc:/tmp.qml"));
    QObject *item = component.create();
    SingletonBaseClass *instance = qvariant_cast<SingletonBaseClass *>(item->property("obj"));
    return instance;
}

В следующей ссылке мы показываем пример.

Другие вопросы по тегам