2017-07-04 10 views
0

私はこのようなオブジェクトをQMLのオブジェクトを削除して再作成しようとしています削除する方法:オブジェクトを生成し、それを削除するstopを呼び出すために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を。

  1. recreate⇒コンソール出力のCreateObject

  2. stop

  3. recreate⇒コンソールなし出力

obj.destroy()obj.deleteLater()はどちらも処理されません。 C++でdeleteのように、動的に作成されたオブジェクトを強制的に削除する方法。

+1

あなたが破壊呼び出した後にnullにOBJを設定しようとしましたか?私はnull値の初期値も与えますvar obj:null –

+0

Creatorは 'obj'の値をチェックできるQMLデバッガを持っています。 – Mitch

+0

'Component.onDestruction:console.log( 'destroy')'を 'Component'の' Video'-Itemに、 'console.log(obj)'を 'function 'の第1行として追加してください再作成する(url) '。さらに、チェーンのどこかでこの信号を使用している場合は 'onVideoStopped:console.log(complete)' – derM

答えて

0

代わりにLoaderを使用してください。
それは動的に項目をロードし、あなたがundefinedsourceComponentプロパティを設定することによって、それを破壊することができます

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 
     } 
    } 
} 
関連する問題