Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从c++;到qml。空闲内存呢?_C++_Qt_Memory Leaks_Qml - Fatal编程技术网

C++ 从c++;到qml。空闲内存呢?

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

有一个模型继承自QAbstractListModel,我在qml中使用它。此模型的属性之一是参数,它们特定于此模型的图元类型。这是一个元素,这个类的参数TemperatureParam,DifrentParamType另一个,第三个仍然是。。。如何将对象传递给qml并确保在使用后释放内存?下面的代码现在可以按照我的需要工作了,但在我看来它并不安全

Param类非常简单:

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++方法调用返回的对象将被设置为JavaScript所有权> /Calp>,但这仅适用于<代码> QyNojkabd> /Calp>方法或槽。

因为方法<代码>数据< /C>不是一个明确的C++方法调用,应该考虑将对象所有权设置为<代码> QQMLIGNE::JavaCcript所有权< /Calp>调用<代码> SETObjOutoServer()< <代码> < /P> 因此,一般来说:

  • 如果希望QML销毁对象,请不要使用
    qqqmlengine::CppOwnership
    。相关数据将在适当时删除(即,在垃圾收集器发现不再有对该值的活动引用之后)
  • QSharedPointer
    可能不起作用。你有更多的信息

哇,我不知道。谢谢你的回复。但是我尝试了setObjectOwnership,它对我的效果比以后差得多。如果我稍后离开delete,那么如果QQmlEngine和我的模型是在同一个线程中创建的,那么就足够安全了。退出函数temperatureParam.openItem(QML)后,我不再需要该对象。或者该对象可能在之前被删除?@lirik90谢谢你!嗯,我没有说要删除
deleteLater
行代码。对不起,如果我没有正确解释我自己:(如果
数据
是在
温度RAM.openItem
期间执行的(我说得对吗?),那么我认为
p
不会被删除,除非您将其所有权设置为
QQmlEngine::JavaScriptOwnership
。因此,为了安全起见,在将
qqqmlengine::JavaScriptOwnership
新对象移交给QML时,是否总是设置
QQmlEngine::JavaScriptOwnership
是合理的,即使上面暗示QML将获得所有权?在这种情况下,我会考虑这一点以使传输更加清晰:<代码>模板T*TrimeObjObjServtoJavaScript(STD:UnQuyPPTR PTR){T*RESULTS= PTR.GET();QQMLMENT::SETObjutsAt所有权(PTR.RelaseEo),QQMLIGMEN::JavaScript所有权);返回结果;}。
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()
    }
}