如何查找单例对象的QQmlEngine实例?

时间:2018-01-13 20:19:00

标签: qt qml qqmlengine

我有一个类SingletonBaseClass,它在C ++中定义,后来在QML中扩展。在qmldir文件中,它被标记为Singleton:

// 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. 如何在SingletonBaseClass中检索QQmlEngine实例?
  2. 如何从静态函数中获取指向我的单例实例的指针?
  3. 注意:我的应用程序中有多个QML引擎实例。

    [更新]:我对建议的解决方法不满意,因此我最终为1和this patch提供了QQmlEngine::singletonInstance()。两个更改都可用在Qt 5.12。

1 个答案:

答案 0 :(得分:3)

如果您想获得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;
}

在下面的link中,我们展示了一个示例。