我有一个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
。它适用于一个窗口而不是另一个窗口的原因是什么?
答案 0 :(得分:0)
所以我最终解决了它,它与QML单例或多个顶级窗口无关 - 但它与从{{1}传递{QML引擎的QObject
指针有关方法(在我的例子中是Q_INVOKABLE
方法)。
来自文档:
QML未创建的对象默认具有CppOwnership。例外 这是从C ++方法调用返回的对象;在这些情况下, 返回对象的所有权将设置为JavaScriptOwnerShip。 请注意,这仅适用于Q_INVOKABLE方法的显式调用 或插槽,而不是属性getter调用。
所以QML引擎删除了我的Sy_application_qml::get()
指针。解决方案很简单:
Sy_application