我有一个QVector<CConfiguration*>
列表作为ListView的数据源。我动态创建这些对象并将其设置为ContextProperty。
qmlRegisterUncreatableType<CConfiguration>("DataObjects", 1, 0, "Configuration",QStringLiteral("Configuration should not be created in qml."));
configs.load();
engine.rootContext()->setContextProperty(QStringLiteral("configurations"), &configs);
到目前为止一切都很好。 ListView显示所有数据正常。 当我现在尝试访问单个数据对象时。
var item = configurationsModel.get(3);
这个对象后来被破坏了,当我滚动LIstView之后给了我一个SIGSEGV。 get方法返回CConfiuration *
感谢您的想法或帮助
答案 0 :(得分:2)
如果没有看到您的代码,我猜您遇到的问题是one of ownership:
当数据从C ++传输到QML时,数据的所有权 始终使用C ++。 此规则的例外是QObject 从显式C ++方法调用返回:在本例中为QML 引擎承担对象的所有权,除非拥有该对象 已明确设置对象通过调用保留在C ++中 QQmlEngine :: setObjectOwnership()与QQmlEngine :: CppOwnership 指定。
此外,QML引擎尊重普通的QObject父级 Qt C ++对象的所有权语义,永远不会删除QObject 有父母的实例。
修复方法是明确设置所有权:
QQmlEngine::setObjectOwnership(&configs, QQmlEngine::CppOwnership);
或者给对象一个父对象(在堆上分配它之后):
Configs *config = new Configs(&application);
configs->setParent(&application)
无论选择哪个选项,都必须在设置context属性并加载应用程序的QML之前完成。