qmlRegisterSingletonType和多个顶级窗口

时间:2014-10-01 07:22:24

标签: qt qml

我有一个QGuiAppplication派生类(称为Sy_application),我用另一个(称为Sy_application_qml包装,带有额外的一些QML特定功能),然后将其注册为单例使用QML引擎。

这一切都可以在第一个打开的顶级窗口中正常工作,但第二个(并且可能更多)仅从单例中获得null。添加一些调试:

// The static factory method used in the qmlRegisterSingletonType call.
QObject* Sy_application_qml::factory( QQmlEngine* engine,
                                      QJSEngine* scriptEngine )
{
    Q_UNUSED( engine )
    Q_UNUSED( scriptEngine )

    qDebug() << "Creating";
    return new Sy_application_qml();
}

// SY_APP is the qApp macro casted to my Sy_application type.
QObject* Sy_application_qml::get()
{
    qDebug() << "Getting:" << SY_APP;
    return SY_APP;
}

// This is an example of it's use within QML
onPositiveClicked: {
    console.log( Sy_application_qml );
    Sy_application_qml.get().newProject( sampleRate.value, frameRate.value );
    close();
}

调试输出:

// Opening first window.
Creating

// Creating second
qml: Sy_application_qml(0x1895b30)
Getting: Sy_application(0x7fff80f051c0)

// Attempting to create third
qml: Sy_application_qml(0x1895b30)
Getting: Sy_application(0x7fff80f051c0)
qrc:/qml/gui/dialogs/Sy_newProjectDialog.qml:62: TypeError: Cannot call method 'newProject' of null

正如您所见,单例仍然存在且C ++ Sy_application实例正在正确返回,但在QML端显示为null。它适用于一个窗口而不是另一个窗口的原因是什么?

1 个答案:

答案 0 :(得分:0)

所以我最终解决了它,它与QML单例或多个顶级窗口无关 - 但它与从{{1}传递{QML引擎的QObject指针有关方法(在我的例子中是Q_INVOKABLE方法)。

来自文档:

  

QML未创建的对象默认具有CppOwnership。例外   这是从C ++方法调用返回的对象;在这些情况下,   返回对象的所有权将设置为JavaScriptOwnerShip。   请注意,这仅适用于Q_INVOKABLE方法的显式调用   或插槽,而不是属性getter调用。

所以QML引擎删除了我的Sy_application_qml::get()指针。解决方案很简单:

Sy_application