如何找出单例对象的 QQmlEngine 实例?
How to find out the QQmlEngine instance of a singleton object?
我有一个 class SingletonBaseClass
,它是在 C++ 中定义的,后来在 QML 中进行了扩展。在qmldir文件中,标记为单例:
// qmldir file
singleton SingletonClass 1.0 SingletonClass.qml
// SingletonClass.qml
import QtQml 2.0
pragma Singleton
SingletonBaseClass {
// ...
}
这是基础class:
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;
}
};
- 如何在 SingletonBaseClass 中检索
QQmlEngine
实例?
- 如何从静态函数中获取指向我的单例实例的指针?
注意:我的应用程序中有多个 QML 引擎实例。
[更新]: 我对建议的解决方法不满意,所以我最终为 2 贡献了 this patch for 1. and QQmlEngine::singletonInstance()。这两个更改都将在 Qt 5.12 中可用。
如果你想获得 QQmlEngine
你可以使用 contextForObject()
方法,如下所示:
Q_INVOKABLE void someMethodCalledFromQml()
{
QQmlEngine *ownerEngine = QQmlEngine::contextForObject(this)->engine();
qDebug()<<ownerEngine;
}
qml 中的单例没有父对象,因此访问它们的方法是创建一个 属性,为此我们创建一个 .qml 并创建一个对象 属性 作为单例:
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;
}
下面link我们举个例子
我有一个 class SingletonBaseClass
,它是在 C++ 中定义的,后来在 QML 中进行了扩展。在qmldir文件中,标记为单例:
// qmldir file
singleton SingletonClass 1.0 SingletonClass.qml
// SingletonClass.qml
import QtQml 2.0
pragma Singleton
SingletonBaseClass {
// ...
}
这是基础class:
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;
}
};
- 如何在 SingletonBaseClass 中检索
QQmlEngine
实例? - 如何从静态函数中获取指向我的单例实例的指针?
注意:我的应用程序中有多个 QML 引擎实例。
[更新]: 我对建议的解决方法不满意,所以我最终为 2 贡献了 this patch for 1. and QQmlEngine::singletonInstance()。这两个更改都将在 Qt 5.12 中可用。
如果你想获得 QQmlEngine
你可以使用 contextForObject()
方法,如下所示:
Q_INVOKABLE void someMethodCalledFromQml()
{
QQmlEngine *ownerEngine = QQmlEngine::contextForObject(this)->engine();
qDebug()<<ownerEngine;
}
qml 中的单例没有父对象,因此访问它们的方法是创建一个 属性,为此我们创建一个 .qml 并创建一个对象 属性 作为单例:
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;
}
下面link我们举个例子