QML 自制二级开合下拉菜单

一开始本来是使用ComboBox制作下拉菜单的控件,但是后面发现ComboBox实现不了我的需要,因此只能自己拿基础的控件来做了,我本身也没什么经验,这次就算是和大家探讨一下

直接上代码

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
//import ABC 1.0
import QtQuick.Dialogs 1.1
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1

import QtQuick.Window 2.2
import QtQuick.Controls 2.2



//有少量属性目前未能做到在外部设置可以在内部文档进行设置

Item {

    Component.onCompleted: {
        add_ModelData("haha","hehe")
        add_ModelData("haha","hafcehe")
        add_ModelData("haha","hawahe")
        add_ModelData("haha","heche")
        add_ModelData("hahawfa","hehe")
        add_ModelData("hahawfa","heafhe")
        add_ModelData("first","English")
        add_ModelData("first","chinese")
    }
    id:myItem
    width: 200
    height: 50

    //设置标题部分的属性
    property alias mainWidth: myItem.width
    property alias mainHeight: myItem.height
    property alias mainColor: titleBox.color
    property alias mainRadius: titleBox.radius
    property alias mainSet: choiceShow.text//设置标题首次显示
    property alias mainTextSize: choiceShow.font.pointSize//设置字体大小
    property alias mainTextColor: choiceShow.color

    //设置下拉框属性
    property alias dropBoxWidth: box.width
    property alias dropBoxHeight: box.height
    property alias dropBoxColor: box.color//下拉框填充颜色
    property alias dropBoxRadius: box.radius

    //下拉框内选项标题属性
    property alias titleWidth: menu.width
    property alias titleHeight: menu.height
    //property alias titleColor: strip.color


    //二级控件属性设置
//    property alias secondWidth: box_.width
//    property alias secondHeight: box_.height
//    property alias secondColor : box_.color


    //控件标题部分
    Rectangle{
        id:titleBox
        width: parent.width
        height: parent.height
        radius: 15
        color: "red"
        Text {
            id: choiceShow
            width: 150
            height: 50
            font.pointSize: 10
            color: "blue"
            horizontalAlignment: Text.AlignHCenter//水平居中
            verticalAlignment: Text.AlignVCenter//垂直居中
            text: qsTr("please choose")
        }
        Rectangle{
            width: 50
            height: 50
            radius: 30
            color: "red"
            anchors.left: choiceShow.right
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    box.focus = !box.focus
                }
            }

        }
    }

    //控件下拉框
    Rectangle{
        id:box
        width: titleBox.width
        height: 125
        radius: 5
        visible: focus ? true:false
        anchors.top: titleBox.bottom
        color: "pink"
        z:30

        //下拉框内控件标题按钮属性
        ListView {
            id:menu
            width: titleBox.width; height: parent.height
            model:titleData

            //设置菜单样式
            delegate:ColumnLayout{
                spacing: 2
                Layout.fillWidth: true;

                //一级滑动条
                Rectangle{
                    //radius: 30
                    id:strip
                    width: titleBox.width
                    height: 50
                    radius: 5
                    color: "green"
                    border.color: "black"
                    border.width: 2
                    Text {
                        id:secondTitle
                        width:titleBox.width
                        height: 50
                        text: titleSet
                        horizontalAlignment: Text.AlignHCenter//水平居中
                        verticalAlignment: Text.AlignVCenter//垂直居中
                    }
                    MouseArea{
                        anchors.fill: parent
                        onClicked: {
                            menu.currentIndex = index
                            //inter_cpp.catalogue_choose = index
                            console.log("[get the index is] :" ,menu.currentIndex)
                            //add_VIDEO_LIST()
                            box_.focus = !box_.focus
                        }
                    }
                }

                //控件组内控件
                Rectangle{
                    id:box_
                    width: titleBox.width
                    height: 50                       // <<<<==========================设置二级下拉条的长度
                    visible: focus ? true:false
                    color: "blue"                   // <<<<==========================设置二级下拉条的底色


                    //二级滑动条(存在于一级滑动条内部)
                    ListView {
                        id:list
                        width: titleBox.width; height: parent.height
                        clip: true


                        Component {
                            id: contactsDelegate
                            Rectangle {
                                id: wrapper
                                width: titleBox.width
                                height: 25
                                color: ListView.isCurrentItem ? "black" : "red"     // <<<<================ 每一条的颜色
                                Text {
                                    x:50
                                    id: contactInfo
                                    text: secondTitleDataSet
                                    color: wrapper.ListView.isCurrentItem ? "red" : "black"   // <<<<================ 字体颜色
                                }
                                MouseArea{
                                    anchors.fill: parent
                                    onClicked: {
                                        list.currentIndex = index
                                        choiceShow.text = contactInfo.text
                                        //box.focus = !box.focus                              // <<<<===============是否点击选项后控件窗口就关闭
                                    }
                                }
                            }
                        }
                        model: secondTitleData
                        delegate: contactsDelegate
                        //focus: true
                    }
                }
            }
            focus: true
            clip: true
        }
    }


    //一级菜单数据结构
    ListModel{
        id:titleData
//        ListElement{
//            titleSet:"first"
//        }
    }

    //二级菜单数据结构
    ListModel{
        id:secondTitleData
//        ListElement{
//           secondTitleDataSet:"first"
//        }
    }

    //数据添加函数
    function add_ModelData(title,data){
        var index = findIndex(title)
        if(index === -1)
        {
            titleData.append({"titleSet":title,"secondTitleData":[{"secondTitleDataSet":data}]})
        }
        else
        {
            titleData.get(index).secondTitleData.append({"secondTitleDataSet":data})
        }

    }

    //数据检索判定函数(被 add_ModelData()调用)
    function findIndex(title){

        for(var i = 0 ;i < titleData.count ; i++)
        {
            if(titleData.get(i).titleSet === title)
            {
                return i;
            }
        }

        return -1;
    }

}

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML自制ComboBox可以通过自定义控件来实现,可以使用基础的控件来模拟ComboBox的功能。根据您的需求,您可以创建一个下菜单控件,通过点击按钮展或收起菜单选项。在QML中,您可以使用ListView或者Repeater来显示菜单选项,然后根据用户的选择更新显示文本。您可以使用Item来创建自定义样式,设置按钮样式、菜单选项样式等。您还可以使用属性来填充数据模型,可以使用JavaScript数组、ListModel或者整数,也支持其他类型的数据模型提供的属性。通过使用这些控件和属性,您可以根据自己的需求来自制ComboBox。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [QML 自定义ComboBox控件](https://blog.csdn.net/weixin_43892328/article/details/122615847)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [QML 自制二级菜单](https://blog.csdn.net/weixin_51019869/article/details/118146812)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值