我有一个类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;
}
};
QQmlEngine
实例?注意:我的应用程序中有多个QML引擎实例。
[更新]:我对建议的解决方法不满意,因此我最终为1和this patch提供了QQmlEngine::singletonInstance()。两个更改都可用在Qt 5.12。
答案 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中,我们展示了一个示例。