如何删除QML对象

时间:2017-07-04 10:04:43

标签: c++ qml

我正在尝试删除QML对象并重新创建这样的对象:

Rectangle{
    property var obj

    signal videoStopped(variant complete)

    function recreate(url){
        if(!obj){
            console.log("createObject")
            obj = videoComponet.createObject(root)
            obj.stopped.connect(function(){
                videoStopped(obj.status == MediaPlayer.EndOfMedia)
            })
        }
        obj.source = url
        obj.play()
    }
    function stop(){
        obj.destroy() // obj.deleteLater()
    }
    Component{
        id: videoComponet
        Video {
            anchors.fill: parent
            visible: true
            autoPlay: true; autoLoad: true
        }
    }
}

C ++边调用recreate生成一个对象并调用stop删除它。

  1. recreate⇒控制台输出createObject

  2. stop

  3. recreate⇒控制台无输出

  4. obj.destroy()obj.deleteLater()都无效。 如何强制删除动态创建的对象,就像在C ++中删除一样。

2 个答案:

答案 0 :(得分:0)

请改用Loader 它会动态加载项目,您可以通过将sourceComponent属性设置为undefined来销毁它:

Loader {
    id: loader
}

Component {
    id: myDynComp
    Rectangle {
        width: 40; height: 40
        anchors.centerIn: parent
    }
}


Row {
    Button {
        width: 120; height: 40
        text: "Load"
        onClicked: {
            loader.sourceComponent = myDynComp; //load/create component dynamically
        }
    }

    Button {
        width: 120; height: 40
        text: "UnLoad"
        onClicked: {
            loader.sourceComponent = undefined; //causes destoying loaded component
        }
    }
}

答案 1 :(得分:0)

S.M.Mousavi's answer的微小更改: 我观察到将sourceComponent设置为undefined无效。我必须将其设置为null才能卸载组件。另一种选择是将源设置为空字符串。

onClicked: {
    loader.sourceComponent = null; //causes destroying loaded component
}

OR

onClicked: {
    loader.source = ""; //causes destroying loaded component
}