有一个从QAbstractListModel继承的模型,我在qml中使用它。此模型的一个属性是参数,它们特定于此模型的元素类型。这是此类参数的一个元素TemperatureParam,DifrentParamType另一个,第三个仍然是...我怎样才能将对象传递给qml并确保在使用后释放内存?下面的代码现在可以正常工作,但在我看来它并不安全。
Param课程非常简单:
class QuickTemperatureParam : public QObject
{
Q_OBJECT
Q_PROPERTY(float param1 READ param1 WRITE setParam1)
//...
};
模特课(以下是我要问的内容):
class SectionsModel : public QAbstractListModel
{
//...
QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const override
{
//...
int type = getType( idx );
if (type == 1)
{
auto p = new QuickTemperatureParam( idx );
p->deleteLater(); // This is all right or no?
return qVariantFromValue(p);
}
else if (type == 2)
//...
}
};
QML是这样的:
ListView {
model: sectionsModel
delegate: Rectangle {
color: model.statusColor
ItemDelegate {
text: model.title
highlighted: ListView.isCurrentItem
onPressed:
switch ( model.type )
{
case SectionType.Temperature:
temperatureParam.openItem(model)
break;
case SectionType.Lighting:
lightingParam.open(model)
break;
}
}
}
}
Popup {
id: temperatureParam
function openItem(model)
{
var p = model.param
params.itemAt(0).range.from = params.itemAt(1).range.from = p.min
params.itemAt(0).range.to = params.itemAt(1).range.to = p.max
params.itemAt(0).range.setValues( p.dayMin, p.dayMax )
params.itemAt(1).range.setValues( p.nightMin, p.nightMax )
open()
}
}
答案 0 :(得分:5)
当数据从C ++传输到QML时,数据的所有权 始终使用C ++。此规则的例外是QObject 从显式C ++方法调用返回:在这种情况下,QML 引擎承担对象的所有权,除非拥有该对象 已明确设置对象通过调用保留在C ++中 QQmlEngine :: setObjectOwnership()与QQmlEngine :: CppOwnership 指定。
通常,应用程序不需要显式设置对象的所有权。正如您可以阅读here一样,默认情况下,QML创建的对象具有JavaScriptOwnership
。
从C ++方法调用返回的对象也将设置为JavaScriptOwnership
,但这仅适用于Q_INVOKABLE
方法或插槽的显式调用。
因为方法data
不是显式的C ++方法调用,所以您应该考虑将对象所有权设置为QQmlEngine::JavaScriptOwnership
调用setObjectOwnership()
所以,一般来说:
QQmlEngine::CppOwnership
。适当时将删除相关数据(即在垃圾收集器发现没有更多对该值的实时引用之后)QSharedPointer
可能不起作用。您有更多信息here。