2017-07-04 103 views
0

我试图删除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⇒控制台没有输出

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

+1

有你打过电话后消灭的obj设置为null?我也会给它一个null属性var obj的初始值:null –

+0

Creator有一个QML调试器,你可以检查'obj'的值,或者你可以打印出来。 – Mitch

+0

添加如下内容:'Component.onDestruction:console.log('destroy')'到'Component'中的'Video'-Item和'console.log(obj)'作为你函数的第一行重建(URL)'。如果你在链中的某个地方使用这个信号,还需要一个'onVideoStopped:console.log(complete)'。 – derM

回答

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