QML 可以多选ComboBox的实现

由于项目需要,需要设计一个可以多选的ComboBox,看了一下文档,发现QML自带的ComboBox确实无法多选。看了一下ComboBox的实现,发现弹出的下拉菜单是用Menu实现的,看来只能自己重写了,毕竟Menu本身就是无法多选的!代码不多,直接看实现吧!

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4

Item{
    id:root
    implicitWidth: 150
    implicitHeight: 30
    property alias model: lv.model
    property var indexs: []
    property var m_text: ""

    function removeValue(arr,val) {      //删除数组中指定的内容arr数组,val内容
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] == val) {
                arr.splice(i, 1)
                return arr;
            }
        }
    }
    Button{
        id: btn
        anchors.fill: parent
        Text{
            anchors.fill: parent
            anchors.margins: 5
            anchors.rightMargin: 30
            text: m_text
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
            font.pointSize: 12
            clip: true
            elide: Text.ElideMiddle
        }

        onClicked: {
            sv.visible = !sv.visible;
        }
        Image{
            anchors.right: parent.right
            anchors.top: parent.top
            width: root.height
            height:root.height
            source:"换成自己下拉按钮图片"
        }
    }

    Component{
        id: m_del
        Rectangle{
            id:rect
            color:"white"
            implicitWidth: 150
            implicitHeight: 30
            property bool isSelect: false
            Text{
                anchors.fill: parent
                horizontalAlignment:Text.AlignHCenter
                verticalAlignment: Text.AlignVCenter
                font.pointSize: 15
                text: label
            }

            MouseArea{
                anchors.fill: parent
                hoverEnabled: true
                onEntered: {
                    if(!isSelect){
                        rect.color = "#CDDCFE";
                    }

                }
                onExited: {
                    if(!isSelect){
                        rect.color = "white"
                    }
                }
                onClicked: {
                    rect.isSelect = !rect.isSelect;
                    if(!rect.isSelect){         //取消某项
                        rect.color = "white"
                        //删除文本中指定的字符串
                        var arr = m_text.split(",");
                        arr = removeValue(arr,label)
                        m_text = arr.join(",");
                        //删除数组中记录指定的内容
                        indexs = removeValue(indexs,index);
                    }
                    else{                       //选择某项
                        rect.color = "#F9E977"
                        if(m_text.length == 0)
                        {
                            m_text += label;
                        }
                        else{
                            m_text += "," + label;
                        }
                        indexs.push(index)
                    }

                }
            }
        }
    }

    ScrollView{
        id:sv
        anchors.top:btn.bottom
        anchors.left: parent.left
        width: parent.width
        height: 300
        visible: false

        ListView{
            id: lv
            delegate:m_del
            anchors.fill: parent
        }
    }
}

有个地方和官方的ComboBox有些区别,就是需要点击按钮才会将下拉列表收起来,不知道怎样才能实现点击其他位置,关闭下拉列表,有知道的朋友告诉我一声,谢啦!

时间: 2024-11-06 17:19:45

QML 可以多选ComboBox的实现的相关文章

qml Loader异步导致ComBoBox数据乱序

qml  Loader异步导致ComBoBox数据乱序 当使用Loader动态加载qml文件时, 如果将Loader设置为异步,那么动态加载的组件内的ComBoBox数据将呈现乱序状态, 代码请见下文: 图1  动态加载qml文件 图2  测试用qml文件(带ComboBox) 现象: 图3 首尾交替 从上面的现象可以看出, ComboBox的数据按照首尾交替的方式进行呈现: 当我将图1的异步去掉时,如下图: 图4 去掉异步 下图5是去掉异步的情况(不再出现首尾交替现象): 图5 正常显示 原文

QML实现多选按钮

这里使用了条件表达式 import QtQuick 2.0 Item { id: root width: 1920 height: 1080 ListView { width: 600 height: 800 anchors.centerIn: parent model: 5 delegate: Rectangle { id: delegateItem width: 100 height: 50 color: "lightblue" Text { anchors.centerIn: p

winform公共控件

button 按钮 checkbox 多选按钮 CheckedListBox 在一个框内多个多选 ComboBox 下拉菜单 DateTimePicker 时间控件 ListBox 选择多个 MaskedTextBox 限制格式 NotifyIcon 托盘工具 NumericUpDown 数字限制 PictureBox 图片 ProgressBar 进度条 RichTextBox 文本域 TextBox WebBrowser 网页

Qt使用教程之创建Qt Quick项目

<Qt Enterprise最新版下载> Qt长期以来一直以"linux平台下,最著名的开发平台"身份在全世界开发者中享有盛誉.Qt Enterprise v5.5是目前最先进.最完整的跨平台C++开发工具.它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具.那么在本文中,我们将为大家展示如何创建一个新的Qt Quick项目. 当你从头开始创建一个新的Qt Quick项目时,你有一下选择: Qt Quick Application创建一个

EasyUI扩展方法

EasyUI扩展方法: 1.我想指定textarea的行,但editor:{type:'textarea', options: {rows:'4'}}这样写不行.请问大家怎么配置才是指定行的啊? 配置Textarea不可拖动变大变小:   只能自己扩展 textarea 才能实现,配置不用修改,直接扩展就行 Js代码   jQuery.extend(jQuery.fn.datagrid.defaults.editors, { combotree: { init: function(contain

EasyUI扩展方法 + jutil.js

?          EasyUI扩展方法 + jutil.js             博客分类: jQueryEasyUi EasyUI扩展方法: 1.我想指定textarea的行,但editor:{type:'textarea', options: {rows:'4'}}这样写不行.请问大家怎么配置才是指定行的啊? 配置Textarea不可拖动变大变小:   只能自己扩展 textarea 才能实现,配置不用修改,直接扩展就行 Js代码   jQuery.extend(jQuery.fn.

解决QML开发中ComboBox中一个已选择项没有清除的问题

解决QML开发中ComboBox中一个已选择项没有清除的问题 近期使用QML开发一个项目.须要使用ComboBox进行显示.当进行一个操作时,须要向ComboBox加入一个元素,当进行另外一个操作时.须要清除ComboBox里面的元素. 可是在操作的过程中,出现了一个诡异的现象--ComboBox里面的已选择项并没有清除. 以下是程序的截图,能够看到.ComboBox中已选择项并没有删除.可是ComboBox中的候选项已经删除了. 我在QTCN上进行提问.后面再大家的努力下,最终把这个问题攻克了

关于easyUI中combobox多选并附加checkbox的实现

在easyUI的基础组件中combobox只有带radiobutton的效果,而且只支持单选. 但是我们可以在此控件的基础上,对combobox进行重写,就能够实现checkbox多选效果. 大致需要重写以下几个方法: format : function(row){     var opts = $(this).combobox("options");     return "<input type='checkbox' class='combobox-checkbox

jQuery EasyUI combobox多选及赋值

1.多选属性multiple multiple:true多选 multiple:false单选 <input class="easyui-combobox" id="xgr" name="xgr" style="width:435px" url='../Source/Public/json.ashx?action=zhymch' data-options="valueField:'zhymch', textFi