如何找到singleton对象的QQmlEngine实例? 我有一个类 SingletonBaseClass ,它是用C++定义的,后来扩展到QML中。在qmldir文件中,它被标记为单例: // qmldir file singleton SingletonClass 1.0 SingletonClass.qml // SingletonClass.qml import QtQml 2.0 pragma Singleton SingletonBaseClass { // ... }
这是基类:如何找到singleton对象的QQmlEngine实例? 我有一个类 SingletonBaseClass ,它是用C++定义的,后来扩展到QML中。在qmldir文件中,它被标记为单例: // qmldir file singleton SingletonClass 1.0 SingletonClass.qml // SingletonClass.qml import QtQml 2.0 pragma Singleton SingletonBaseClass { // ... },qt,qml,qqmlengine,Qt,Qml,Qqmlengine,这是基类: class SingletonBaseClass : public QObject { Q_OBJECT public: SingletonBaseClass(QObject* parent = nullptr) {} // Get the owner engine Q_INVOKABLE void someMethodCalledFromQml() { QQmlEngine* ownerEngine = ?
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;
}
};
qqqmlengine
实例[更新]:我对建议的解决方案不满意,因此我最终为1做出了贡献。两个人。这两项更改都将在Qt 5.12中提供。如果您想获得
QQmlEngine
可以使用contextForObject()
方法,如下所示:
Q_INVOKABLE void someMethodCalledFromQml()
{
QQmlEngine *ownerEngine = QQmlEngine::contextForObject(this)->engine();
qDebug()<<ownerEngine;
}
然后通过以下代码访问此元素:
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;
}
静态SingletonBaseClass*实例(QQmlEngine*引擎)
{
QQmlComponent组件(引擎,qrl(“qrc:/tmp.qml”);
QObject*item=component.create();
SingletonBaseClass*实例=qvariant_cast(项目->属性(“obj”);
返回实例;
}
在下面的例子中,我们展示了一个例子。您想在C++或QML中获取QQmlEngine吗?如果您使用
qmlRegisterSingletonType
注册您的单例,您可以这样做,因此指向QQmlEngine
的指针是我明确编写的参数之一,该单例在QML中实例化,因此,没有单例提供程序回调。感谢您花费时间和广泛的回答。第一部分,contextForObject()应该为singleton类型返回NULL。你知道为什么它在这种情况下仍然有效吗?可能是因为它被实例化为QML组件,而没有使用单例提供程序函数?第二部分:好把戏!我试图通过将内容放入QQmlExpression来避免额外的文件,但这不起作用。可能是因为。从您的链接中,我没有看到contextForObject()为singleton类型返回NULL。如果单例由QML实例化,则它拥有单例。然而,C++代码可以在QML之前引用单实例。也许C++中实例化C++的独占将返回NulLPTR,因为它的所有者不是QML。另一方面,如果在C++中实例化,则调用qqMLeMex::StutoObjOutoServer()以防止QML删除它,否则应用程序会间歇性地崩溃。一旦在QML中引用,QML将获得所有权,并在适当的情况下在运行时将其删除。
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;
}