C++ 从c++;到qml。空闲内存呢?
有一个模型继承自QAbstractListModel,我在qml中使用它。此模型的属性之一是参数,它们特定于此模型的图元类型。这是一个元素,这个类的参数TemperatureParam,DifrentParamType另一个,第三个仍然是。。。如何将对象传递给qml并确保在使用后释放内存?下面的代码现在可以按照我的需要工作了,但在我看来它并不安全 Param类非常简单:C++ 从c++;到qml。空闲内存呢?,c++,qt,memory-leaks,qml,C++,Qt,Memory Leaks,Qml,有一个模型继承自QAbstractListModel,我在qml中使用它。此模型的属性之一是参数,它们特定于此模型的图元类型。这是一个元素,这个类的参数TemperatureParam,DifrentParamType另一个,第三个仍然是。。。如何将对象传递给qml并确保在使用后释放内存?下面的代码现在可以按照我的需要工作了,但在我看来它并不安全 Param类非常简单: class QuickTemperatureParam : public QObject { Q_OBJECT
class QuickTemperatureParam : public QObject
{
Q_OBJECT
Q_PROPERTY(float param1 READ param1 WRITE setParam1)
//...
};
模型课(以下是我要问的问题):
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()
}
}
根据报告:
当数据从C++传递到QML时,数据的所有权
始终保留C++。此规则的例外情况是当一个QObject
从显式C++方法调用返回:在这种情况下,QML
引擎承担对象的所有权,除非
对象已被明确设置为通过调用保持C++。
qqmlingine::setObjectOwnership()与qqmlingine::CppOwnership
指定的
通常,应用程序不需要显式设置对象的所有权。如您所知,默认情况下,由QML创建的对象具有JavaScriptOwnership
从C++方法调用返回的对象将被设置为 因为方法<代码>数据< /C>不是一个明确的C++方法调用,应该考虑将对象所有权设置为<代码> QQMLIGNE::JavaCcript所有权< /Calp>调用<代码> SETObjOutoServer()< <代码> < /P>
因此,一般来说:
哇,我不知道。谢谢你的回复。但是我尝试了setObjectOwnership,它对我的效果比以后差得多。如果我稍后离开delete,那么如果QQmlEngine和我的模型是在同一个线程中创建的,那么就足够安全了。退出函数temperatureParam.openItem(QML)后,我不再需要该对象。或者该对象可能在之前被删除?@lirik90谢谢你!嗯,我没有说要删除
。相关数据将在适当时删除(即,在垃圾收集器发现不再有对该值的活动引用之后)qqqmlengine::CppOwnership
可能不起作用。你有更多的信息QSharedPointer
行代码。对不起,如果我没有正确解释我自己:(如果deleteLater
是在数据
期间执行的(我说得对吗?),那么我认为温度RAM.openItem
不会被删除,除非您将其所有权设置为p
。因此,为了安全起见,在将QQmlEngine::JavaScriptOwnership
新对象移交给QML时,是否总是设置qqqmlengine::JavaScriptOwnership
是合理的,即使上面暗示QML将获得所有权?在这种情况下,我会考虑这一点以使传输更加清晰:<代码>模板T*TrimeObjObjServtoJavaScript(STD:UnQuyPPTR PTR){T*RESULTS= PTR.GET();QQMLMENT::SETObjutsAt所有权(PTR.RelaseEo),QQMLIGMEN::JavaScript所有权);返回结果;}QQmlEngine::JavaScriptOwnership
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()
}
}