Как узнать экземпляр 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;
}
};
- Как я могу получить
QQmlEngine
экземпляр в SingletonBaseClass? - Как я могу получить указатель на мой экземпляр 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;
}
В следующей ссылке мы показываем пример.