QML - 通过qml' var'访问模型数据破坏数据SIGSEGV

时间:2018-06-11 07:38:52

标签: qt qml

我有一个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 *

感谢您的想法或帮助

1 个答案:

答案 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之前完成。

相关问题