Currently I am trying to port one of my application's view to QML. During porting activity I need to create custom ListView delegate. In any case it looks like in QML ListView dose not provide any default delegate so you need to create one.
So I wanted to put button on my every row of ListView and wanted to emit signal when that button is pressed.
Something like this.(This is final out put of my QML code)
So I began with simple ListView with basic delegate as shown in below code.
Out put will look like below. In above code delegate is created to display one colum with two text element.
Now I need to add image in above item delegate which will act as button and will propogate click event with index of item being clicked.
To add image to item delegate I am adding another column to row element and adding image element in that, also handling various mouse event to simulate button.
So it will look like below.
This is all. In case you want to add highlight to list then you can use following code. You need to add this code to Rectangle element of qml file. Please note that in above code, highlight only moves when you click button or you use keyboard arrow key.
And also you will need to change ListView element to set highlight like below.
Thats all, hope this helps.
So I wanted to put button on my every row of ListView and wanted to emit signal when that button is pressed.
Something like this.(This is final out put of my QML code)
So I began with simple ListView with basic delegate as shown in below code.
import Qt 4.7 Rectangle { width: 250 height: 300 Component { id: listDelegate Item { width: 250; height: 50 Row { Column { width: 200 Text { text: 'Name: ' + name } Text { text: 'Cost:' + cost } } } } } ListModel { id: listModel ListElement { name: "Apple"; cost: 2.45 } ListElement { name: "Banana"; cost: 1.95 } } ListView { id: listView anchors.fill: parent; anchors.margins: 5 model: listModel delegate: listDelegate focus: true } }
Out put will look like below. In above code delegate is created to display one colum with two text element.
Now I need to add image in above item delegate which will act as button and will propogate click event with index of item being clicked.
To add image to item delegate I am adding another column to row element and adding image element in that, also handling various mouse event to simulate button.
Component { id: listDelegate Item { width: 250; height: 50 Row { Column { width: 200 Text { text: 'Name: ' + name } Text { text: 'Cost:' + cost } } Column { width: 50 Image { id: itemBtn source: "btn1.png" MouseArea { anchors.fill: parent; onEntered: { itemBtn.source= "btn2.png"; } onExited: { itemBtn.source= "btn1.png"; } onCanceled: { itemBtn.source= "btn1.png"; } onClicked:{ console.debug("clicked:"+ index); listView.currentIndex = index; } } } } } } }
So it will look like below.
This is all. In case you want to add highlight to list then you can use following code. You need to add this code to Rectangle element of qml file. Please note that in above code, highlight only moves when you click button or you use keyboard arrow key.
Component { id: highlightBar Rectangle { width: 245; height: 40 radius: 5 color: "lightsteelblue" y: listView.currentItem.y; x: listView.currentItem.x-3; Behavior on y { PropertyAnimation {} } } }
And also you will need to change ListView element to set highlight like below.
ListView { id: listView anchors.fill: parent; anchors.margins: 5 model: listModel delegate: listDelegate highlight: highlightBar highlightFollowsCurrentItem: false focus: true }
Thats all, hope this helps.
i did this as delegate but it is not showing up
ReplyDeleteComponent {
id: listDelegate
Item {
width: 250; height: 50
Row {
Column {
width: 200
Text { text: "Id: " + id + " , name:" + name + " ,cost:"+cost}
}
Column {
width: 50
Rectangle {
id: itemBtn
color:"yellow"
MouseArea {
anchors.fill: parent;
onEntered: {
itemBtn.color= "blue";
}
onExited: {
itemBtn.color= "yellow";
}
onCanceled: {
itemBtn.color= "yellow";
}
onClicked:{
console.debug("clicked:"+ index);
listView.currentIndex = index;
}
}
}
}
}
}
}