2017-07-04 94 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 
     } 
    } 
}