Qml控件:ComboBox
Qml控件:ComboBox
- ComboBox默认状态
- 定制ComboBox
- 1、定制框架
- 2、定制指示器
- 3、定制背景
- 4、定制内容
- 5、定制弹框
- 6、定制弹框Item
- 7、弹框项的点击
- 8、定制删除项动作
更多资讯、知识,微信公众号搜索:“上官宏竹”。
ComboBox默认状态
这是一个默认的ComboBox
的样子(Win10上测试结果):
代码很简单,如下所示:
ComboBox {id: controlwidth: 200height: 32model: [qsTr("Fade in"), qsTr("Fade out"), qsTr("Slide")]
}
其中model
是为ComboBox
提供数据。
ComboBox
主要分成两个部分:
- 一个是显示的区域
- 一个是一个
Popup
的弹框,如下:
定制ComboBox
1、定制框架
ComboBox
可以定制的东西有:背景、内容、指示器以及每一个单项的代理,定制框架如下:
ComboBox {delegate: ItemDelegate {}indicator: Image {}contentItem: Text {}background: Rectangle {}
}
2、定制指示器
我们想要更换默认的指示器[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传要如何操作呢?
我们需要改变ComboBox
默认的indicator
样式。如果是一张图片,那么我们可以将indicator
样式改为一个Image
即可。
indicator: Image {x: control.width - width - control.rightPaddingy: control.topPadding + (control.availableHeight - height) / 2width: 16height: 16source: "qrc:/combox_indicator"
}
3、定制背景
那么我们想要改变它的背景的话如何操作呢?
我们需要改变ComboBox
默认的background
样式。我们可以将background
样式改为一个Rectangle
,然后修改这个Rectangle
的颜色即可。
ComboBox {...background: Rectangle {implicitWidth: 120implicitHeight: 40color: "red"border.color: "#464546"border.width: 1radius: 2}
}
效果如上,它改变的背景是ComboBox
主体框架的背景颜色,如果需要改变弹出框中每一个项的背景颜色,这时需要定制delegate
代理,可以查看代理定制一节。
4、定制内容
如果想改变文本的一些属性的话,我们可以改变ComboBox
默认的contentItem
的样式。contentItem
可以使用继承于 Item
的类型进行重新定义。
我们当前可以使用一个Text
来定制文本的颜色、字体等信息,更复杂的需求可以使用Rectangle
等其他的类型进行重新定义。
contentItem: Text {leftPadding: 12rightPadding: control.indicator.width + control.spacingtopPadding: 5bottomPadding: 5text: control.displayTextfont.pixelSize: 18font.bold: truecolor: control.pressed ? "red" : "green"verticalAlignment: Text.AlignVCenterelide: Text.ElideRight
}
正常未点击的状态:
点击时文本颜色改变为红色 (背景修改为白色)。
5、定制弹框
popup
的弹框可以使用Popup
类型去定义,但它不能使用其他类型定义,毕竟这是一个弹框,不可以用Rectangle
等去定义它。
既然是Popup
类型,那么它也有它的背景属性background
,这个和上述的定制背景可以做一样的操作。
另外在ComboBox
中,对于Popup
来说,最重要的是要定制它弹出的内容,及contentItem
。这里一般都是使用一个ListView
去定制,因为你的数据是一个数组,并且更有可能是一个动态数组(可以支持增删改等操作)。
我们定制Popup
的基本框架如下,背景的定制和上述一样。这里重点讨论对contentItem
的定制。
popup: Popup {contentItem: ListView {}background: Rectangle {}
}
对于ListView
,一般写法如下:
contentItem: ListView {clip: trueimplicitHeight: contentHeightmodel: control.popup.visible ? control.delegateModel : nullcurrentIndex: control.highlightedIndexScrollIndicator.vertical: ScrollIndicator { }
}
implicitHeight: contentHeight
中的contentHeight
是Popup
的成员,表示弹框的隐式高度。
另外,最重要的是我们要定制它的代理,即:model: control.popup.visible ? control.delegateModel : null
,详见下一节。
6、定制弹框Item
对于每一项的定制,需要实现一个delegate : Component
。代理的组件,官方推荐使用ItemDelegate
或任何其他继承于AbstractButton
的类型作为代理,这一点是为了确保弹框能够正常的交互工作以及自动关闭,如果使用其他类型作为代理组件,那么一定需要自己关闭弹框。在此我们使用官方推荐的ItemDelegate
作为代理。
ItemDelegate
同样的有contentItem
、background
,因为它继承自Control
。对于每项的背景色的定制,通上述的定制背景一样,使用一个Rectangle
来完成。对于contentItem
的定制,我们可以增加许多内容,比如由两个部分组成:文本+图片,文本靠左,图片靠右,那么格式如下:
contentItem: Item {anchors.fill: parentText {}ImageButton {}
}
Text
按照正常的定义如下:
Text {anchors.left: parent.leftanchors.leftMargin: 11anchors.top: parent.topanchors.topMargin: 4anchors.bottom: parent.bottomanchors.bottomMargin: 4text: modelDatacolor: "#FFFFFF"font: control.fontelide: Text.ElideRightverticalAlignment: Text.AlignVCenter
}
主要是定义它的锚点及文本大小、颜色等属性。这里说一下text: modelData
,这里指的是ComboBox
属性model
中的数据部分,是一个内置变量。
ImageButton
是一个图片按钮,跟按钮的属性基本一致,只是多了一个图片,可以参考这骗文章:。
整个效果如下:
7、弹框项的点击
处理下拉选项卡的点击事件。
可以在delegate: ItemDelegate
中处理,ItemDelegate
有一个clicked
的信号,来处理点击事件,然后使用index
来表示点击的是第几个选项。
8、定制删除项动作
定制一个点击弹框项右侧的“-”减号图标,将实时删掉一项。这个需要执行两个步骤:
将
model
项改用ListModel
实现(因为ListModel
有增删的接口)ListModel {id: listModelListElement { modelData: qsTr("Fade in") }ListElement { modelData: qsTr("Fade out") }ListElement { modelData: qsTr("Slide") } }
将
ComboBox
的model
项改为:model: listModel
。实现
ImageButton
的点击事件定义一个信号,并在
ImageButton
的点击事件onBtnClicked
将其触发(ImageButton
的具体实现可以参考:自定义Qml控件:ImageButton 一章),代码格式如下:signal itemMinus(int index)ImageButton {onBtnClicked: {itemMinus(index)} }
外部实现
itemMinus
这个信号的槽函数onItemMinus
,在这个槽函数中将model
的项删除一个即可。
效果如下:
如果想要每一个弹出项都不一致,可以对model
,增加几个属性,在弹框的contentItem: Item
中进行定制化修改。比如,如果想控制某个弹出项是否显示删除按钮,可以将ListModel
增加一个域,如下定义:
ListModel {id: listModelListElement { modelData: qsTr("Fade in"); minus: false }ListElement { modelData: qsTr("Fade out"); minus: ture }ListElement { modelData: qsTr("Slide"); minus: ture }
}
在ComboBox
内部通过model.minus
变量来判定ImageButton
的显示与否。
完整实现可以微信搜索公众号:“上官宏竹”,或者扫下面的二维码,关注并回复:“ComboBox”,获取资源链接。有任何疑问也可以公众号里留言咨询。
更多资讯、知识,微信公众号搜索:“上官宏竹”。
Qml控件:ComboBox相关推荐
- Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)
Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 目录 Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 前言 简单的平移.旋转和放缩 其他元素的一些基本使用 qm ...
- Windows 标准控件 ComboBox 的改造
Windows 标准控件 ComboBox 的改造 目的 windows 下拉列表的标准控件为ComboBox(WC_COMBOBOX),对复选模式.只读模式支持不太好,该内容尝试对其进行复选模式.只 ...
- C#窗体控件-组合框控件ComboBox
Windows窗体中的组合框(ComboBox)控件用于在下拉组合框中显示数据.组合框控件结合了文本框和列表框控件的特点,用户可以在组合框内输入文本,也可以在列表框中选择项目. ComboBox 控件 ...
- QML控件拖动并靠边停留
前言 用QML做控件拖动,当鼠标按下要拖动的按钮然后移动鼠标,控件坐标会随着鼠标而移动,释放鼠标后判断当前的控件位置,然后选择要停留在父窗口的左边还是右边,再通过动画将控件移动到边上.这种场景在做工具 ...
- Qml控件之Calendar日历
Calendar(日历)控件是基于Qml实现的,它兼容于QtQuick 1.x和QtQuick 2.x.可用于显示日期信息. 1. 演示 2. 例子 import QtQuick 2.0 // Qt4 ...
- QML控件--MenuBar
文章目录 一.控件基本信息 二.控件使用 三.属性成员 四.成员函数 一.控件基本信息 Import Statement:import QtQuick.Controls 1.4 Since:Qt 5. ...
- Qml控件设置字体样式
Qml中的部分控件支持设置字体样式,如Control控件有font属性,可以用来设置字体样式(除了字体的颜色),按照正确的格式编写才可以运行正常. 正确编写格式如下: import QtQuick 2 ...
- 兼容Qt4/Qt5版本Qml控件ScrollBar
1. ScrollBar演示 2. 对外属性 继承于Rectangle; target属性继承于Flickable(默认值父控件); orientation设置控件水平还是垂直方向(默认值垂直方向). ...
- 组合框控件ComboBox
概述: ComboBox的功能是从一个列表中一次只能选取或输入一个选项,其主要特点是具有带向下箭头的方框.在程序执行时,按下此按钮就会下拉出一个列表框供用户选择项目.另外用户还可以在组合框上方的框中输 ...
最新文章
- TensorFlow被曝存在严重bug,搭配Keras可能丢失权重,用户反映一个月仍未修复
- 服膺守善 立德立言——院长王建民教授在清华大学软件学院2020届学生毕业典礼上的赠言...
- 104-string和StringBuilder的区别
- element-ui 左侧边栏el-menu组件: 路由跳转 - 案例篇
- Unity 下载存档
- 实用的 Python —— 使用虚拟环境 virtualenv(Linux)
- OpenCV_(Fit Line with points)用直线拟合一组点
- 正交试验设计例题及答案_正交试验设计与数理统计作业.doc
- 如何申请免费的企业邮箱
- blender建模制作课堂笔记
- Java8中关于LocalDateTime转换方法总结
- 解决mysql的中文问号或乱码问题
- 搜索引擎Bing必应高级搜索语法
- 达梦出席湖北银行业金融机构信息科技风险管理研讨会
- MATLAB/ArcGIS读取nc数据并进行可视化
- 手动下载VMware Tolls.ISO
- jar包应该怎么打?
- 【转】ArcGIS server如何将自己的小地图叠加到Google maps或者Virtual Earth上
- 二狗子的C语言学习之路(数组)
- RSA加密算法补充签名验签部分
热门文章
- 银河麒麟高级服务器操作系统(飞腾版)V10
- IBM的服务器芯片,IBM搞定5nm芯片工艺 可放置300亿晶体管
- 为什么计算机二级打不开,电脑二级网页打不开是什么回事
- 富士康高管三年受贿逾千万 回扣牵出管理难题
- 写给小白看的线程池,还有10道面试题
- hugo 导入图片,两种方式
- LocalDateTime获取时间戳、LocalDateTime与String互转、Date与LocalDateTime互转(Java8 特性)
- Win10更改注册表win defend键值提示无法更改所有者
- 推荐系统和搜索系统和信息流2
- 使用手机热点安装并配置树莓派(无屏无网线)