如何找到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;
    } 

};
  • 如何在SingletonBaseClass中检索
    qqqmlengine
    实例
  • 如何从静态函数中获取指向我的单例实例的指针
  • 注意:我的应用程序中有多个QML引擎实例


    [更新]:我对建议的解决方案不满意,因此我最终为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;
    }