How to delete QML object

别说谁变了你拦得住时间么 提交于 2020-01-15 08:47:06

问题


I am trying to delete QML object and recreate object like this:

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++ side call recreate to generate an object and call stop to delete it.

  1. recreate ⇒ console output createObject

  2. stop

  3. recreate ⇒ console no output

Both obj.destroy() and obj.deleteLater() not worked. How to forcedly delete the dynamically created object just like delete in C++.


回答1:


Use Loader instead.
It loads an Item dynamically and you can destroy it by setting sourceComponent property to 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
        }
    }
}



回答2:


A minor change to S.M.Mousavi's answer: I observed that setting sourceComponent to undefined does not work. I have to set it to null to unload the component. Another option is to set the source to empty string.

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

OR

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


来源:https://stackoverflow.com/questions/44902936/how-to-delete-qml-object

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!