我该如何在QML ListView中选择几个元素并将它们的索引发送到C++代码?
做以下操作:如果单击一个元素,则设置其属性为已选(或者你想怎么称呼它),并在代理中设置如果选择为true,则应以不同的格式进行格式化。此外,将其添加到某个列表中以便于处理。
我很确定无法使QML ListView支持多选。Qt Declarative专注于触摸屏使用,纯触摸界面下没有有意义的多选方式。
我曾经遇到了同样的问题,我发现最好的实现方法是在列表视图中创建一个新角色。假设它是“firstname”和“selected”。你需要同时使用onCurrentIndexChanged和onClicked事件,因为如果你滚动,这将改变项目但不是点击。在这两个事件中,把“selected”这个角色改为true,或根据自己的需要进行调整,也许你不需要滚动来选择,因此只使用onClicked事件即可。当单击时,你可以将“selected”这个角色改为true。
onCurrentIndexChanged:
{
mListModel.append({"firstName": newEntry,"selected":true})
}
onClicked:
{
mListModel.append({"firstName": newEntry,"selected":true})
}
然后您可以在委托中使用高亮,这将根据所选状态更改颜色。
这里是一个完整的代码,已经测试过可用:
//copyright: Dr. Sherif Omran
//licence: LPGL (not for commercial use)
import QtQuick 2.12
import QtQuick.Layouts 1.12
Item {
property string addnewitem:""
property int removeitemindex: -1
property string appenditemstring: ""
property int appenditemindx:-1
property int fontpoint: 20
property int radiuspoint: 14
property int spacingvalue: 0
property string delegate_color:"beige"
property string delegate_border_color:"yellowgreen"
property string highlight_color:"deeppink"
signal selectedvalueSignal (string iTemstring, string stateval)
property string sv: ""
property int indexcopy:0
id:lstmodelitem
width: parent.width
height: parent.height
ListModel {
id : mListModel
// ListElement {
// firstName : "John"
// }
}
ColumnLayout {
anchors.fill: parent
ListView{
id : mListViewId
model:mListModel
delegate :delegateId
Layout.fillWidth : true
Layout.fillHeight: true
clip: true
snapMode: ListView.SnapToItem //this stops the view at the boundary
spacing: spacingvalue
highlight: Rectangle
{
id: highlightid
width: parent.width
color: mListModel.selected==="true"?"blue":highlight_color
border.color: "beige"
z:3
opacity: 0.2
}
highlightRangeMode: ListView.StrictlyEnforceRange
highlightFollowsCurrentItem:true
onCurrentIndexChanged:
{
console.log("olistdynamic Indexchanged" + currentIndex)
mListViewId.currentIndex=currentIndex
lstmodelitem.selectedvalueSignal(currentIndex, mListModel.selected)
indexcopy=currentIndex
}
}
}
function getindex()
{
console.log("current index = " + indexcopy)
return mListViewId.currentIndex
}
function setindex(index)
{
//console.log("olistdynamic set index"+index)
mListViewId.currentIndex=index
}
function add2Item(newEntry,statev){
console.log("added item with value = " + newEntry + "state " + statev)
mListModel.append({"firstName": newEntry,"selected":statev})
}
function deleteItem(index){
mListModel.remove(index,1)
}
function appendIdem(index,valueEntry,newselectedsate)
{
console.log("append item")
mListModel.set(index,{"firstName": valueEntry,"selected":newselectedsate})
}
Component {
id : delegateId
Rectangle {
id : rectangleId
width : parent.width // Remember to specify these sizes or you'll have problems
height: textId.implicitHeight*1.2
color: selected==="true"?"blue":delegate_color
border.color: delegate_border_color
radius: radiuspoint
Text {
id : textId
anchors.centerIn: parent
text : firstName
font.pointSize: fontpoint
}
MouseArea {
anchors.fill: parent
onClicked: {
lstmodelitem.selectedvalueSignal(mListModel.firstName,mListModel.selected)
mListViewId.currentIndex=index
console.log("current index = " + index)
indexcopy=index
appendIdem(index,firstName,"true")
}
onClipChanged:
{
//console.log("a")
}
}
}
}
//if the item has been changed from null to text
onAddnewitemChanged: {
console.log("added item" + addnewitem)
add2Item(addnewitem)
}
//remove item with index
onRemoveitemindexChanged: {
console.log("remove item")
deleteItem(removeitemindex)
}
//to change the item, change the index first then the string
onAppenditemstringChanged: {
appendIdem(appenditemindx,appenditemstring)
}
}
您可以尝试在奇数次点击时获取ListItem的数据并将其存储到数组中,在偶数次点击时从数组中删除ListItem的数据。这可能是一个简单的解决方案,而不是创建一个类似复选框的项目列表。