Pj Toopmuch
Pj Toopmuch

Reputation: 147

Receive signal in newly added listview entry

I am trying to execute a function in a newly added entry to my ListView. After adding an entry via button I want to execute the just added delegate's onNewEntry function. But only the old delegates execute it.

Minimal example:

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.0

Window {
id:root
width: 640
height: 480
visible: true
signal newEntry(int new_row)
property var someProperty
ListModel {
    id:listmodel
    ListElement {
        name: "Bill Smith"
    }
    ListElement {
        name: "John Brown"
    }
    ListElement {
        name: "Sam Wise"
    }
}

ListView{
    id: listView
    width:100
    height:200
    model: listmodel
    delegate: ItemDelegate{
        id:delegateId
        Text{
        text:name
        }
        Connections { //ISSUE!!!: the new delegate doesnt execute this, just the old ones
            target: root
            function onNewEntry(new_row){
                console.debug(index)
                console.debug(new_row)
                if(new_row==index){ //doesnt get true
                    listView.currentIndex = index
                    setProductData()
                }
            function setProductData(){
                root.someProperty=name
                }
            }
        }
     }
}
Button {
    anchors.top: listView.bottom
    id: btnAdd
    text:"+"
    onClicked:{
        listmodel.append({"name":"Joe Black"})
        newEntry(listView.count-1) //emit signal newEntry
    }
}
}

output: qml: 0 qml: 3 qml: 1 qml: 3 qml: 2 qml: 3

My already mentioned workaround is using ListView.onAdd in the delegate:

delegate: ItemDelegate{
    ListView.onAdd: {
        setProductData()
    }

My question is: Why does the newly added entry doesnt listen to the newEntry signal. Thank you

Upvotes: 0

Views: 540

Answers (2)

Mitch
Mitch

Reputation: 24406

It would be easier to just set the currentIndex after inserting the new row:

Button {
    id: btnAdd
    onClicked: {
        sqlTableModel.insertNewEmptyRow()
        listView.currentIndex = listView.count - 1
    }        
}

Upvotes: 1

Pj Toopmuch
Pj Toopmuch

Reputation: 147

I found a better, probably more efficient solution:

delegate: ItemDelegate{
    ListView.onAdd: {
        listView.currentIndex=index
        setProductData()
    }

only the newly added delegate receives onAdd not all, like in the approach before.

Upvotes: 0

Related Questions