如何删除QML对象

3

我正在尝试删除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 ⇒ 控制台无输出

obj.destroy()obj.deleteLater()均不起作用。如何强制删除动态创建的对象,就像在C++中使用delete一样。


1
你尝试过在调用destroy后将obj设置为null吗?我建议给它一个初始值为null的属性var obj: null。 - Ehsan Enayati
Creator有一个QML调试器,您可以在其中检查obj的值,或者您可以将其打印出来。 - Mitch
请在您的“组件”中的“Video”项中添加以下内容:Component.onDestruction: console.log('destroy'),并将console.log(obj)作为您的function recreate(url)的第一行。如果您在链中使用此信号,请进一步添加onVideoStopped: console.log(complete) - derM
2个回答

1

S.M.Mousavi的回答进行了微小的更改: 我发现将sourceComponent设置为undefined无效,必须将其设置为null才能卸载组件。另一种选择是将源设置为空字符串。

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

或者

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

1
@mskfisher 我认为这不应该是一个编辑;这将与作者的原始意图产生冲突。然而,这个答案应该更详细地阐述它所注意到的差异。我无法确定它是否在建议用分别列出的那些 onClicked 替换两者中的哪一个。 - zero298

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
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接