QML ListView多选

时间:2010-10-07 07:39:56

标签: c++ qt listview qml multi-select

如何在QML ListView中选择一些元素并将其索引发送到C ++代码?

4 个答案:

答案 0 :(得分:5)

执行类似的操作:如果单击某个元素,则选择其属性(或者您调用它),并在委托中设置如果selected为true,则应该采用不同的格式。另外,将其添加到某个列表中,以便使用它。

答案 1 :(得分:2)

我很确定没有办法让QML ListView可以多选。 Qt Declarative专注于触摸屏使用,并且没有有意义的方法在纯触摸UI中进行多选。

答案 2 :(得分:1)

您可以尝试获取ListItem的数据并在奇数点击时将其存储到数组中,并在偶数点击时从数组中删除ListItem的数据。可能是一个简单的锻炼,而不是创建像项目一样的复选框列表。

答案 3 :(得分:1)

我遇到了同样的问题,我发现实现它的最佳方法是为listview创建一个新角色。假设它是名字并被选中。您需要同时使用onCurrentIndexChanged和onClicked,因为如果滚动,这将更改项目,但不是单击。在这两种情况下,都可以将选择的角色更改为true,或者根据需要进行调整,这可能是因为您不需要滚动选择,因此仅使用onClicked。单击后,您可以将所选角色更改为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)
    }


}