Best way to remove dynamic qml object from a listmodel



  • I have self destroying qml objects in a list model.
    When they are destroyd I want to remove then from the listmodel, but I dont know their index. So to find the index I'm setting a flag to false when they are about to be destroyed, then I iterate the list to find the object index. It works, but it looks ugly and hacky, is there a better way to find the object list index from inside the object ?

    This is what I did:

    ListModel {
            id: activeEnemiesList
     }
    
        Component.onCompleted: {
        
            var enemy2count = 55
            for (i = 0; i < enemy2count;i++) {
                var enemy2 = lib.createItem("Enemy02.qml", parent) //dynamic creation
            }
       }
    

    Enemy02.qml :

    Item {
        id: enemy02
        property bool timerRunning: y > spaceLimitYmin && y < spaceLimitYmax
        property bool alive: true
    
        onTimerRunningChanged: {
            if (timerRunning) {  // add object to the list
                activeEnemiesList.append({"obj": enemy02})
                console.log("added enemy to the list, size is "+activeEnemiesList.count)
            } else { //remove object from the list and destroy it
                alive = false
                for(var i = 0; i < activeEnemiesList.count; i++) {
                    if (activeEnemiesList.get(i).obj.alive === false) {
                        activeEnemiesList.remove(i,1)
                        enemy02.destroy()
                        break;
                    }
                }
            }
        }
    


  • How are you displaying the individual objects. It must be through delegate. You can use 'index' property inside the delegate which gives you the information required.



  • Thats the problem, I'm not using any delegates so no index available. They are just dynamic qml rectangles that self display randomly on screen, when created. I'm only using a Listmodel to keep track of them to do stuff like collision detection (I could have also used a javascript array instead of listmodel).


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.