Qt-QML-ComboBox-自定义,实现状态表示,内容可以动态正价,使用ListModel
来源:互联网 发布:python开发框架是什么 编辑:程序博客网 时间:2024/06/05 19:58
哎呀呀呀,
问:杀死一个程序员一个程序要需要进步?
答:改三次需求
我感觉我就要再这需求的变更中被杀死了。不管怎么说,总是要跟着需求走的的,客户才是第一么(要不是因为钱,我才不会了)
下面先上个效果
如图中显示一样,我需要再再这个Item前面用来显示一个我的当前设备的状态,这里的状态是有底层数据提供,这里试试做出相应的显示,
绿色标识可以设备可用,而红色表示设备故障,不能使用。
找啊找啊,最好还是找到了Qt的帮助文档,这里有自定义的ComboBox的Demo
先吧人家的源代码贴上来
import QtQuick 2.6 import QtQuick.Controls 2.1 ComboBox { id: control model: ["First", "Second", "Third"] delegate: ItemDelegate { width: control.width contentItem: Text { text: modelData color: "#21be2b" font: control.font elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } highlighted: control.highlightedIndex == index } indicator: Canvas { id: canvas x: control.width - width - control.rightPadding y: control.topPadding + (control.availableHeight - height) / 2 width: 12 height: 8 contextType: "2d" Connections { target: control onPressedChanged: canvas.requestPaint() } onPaint: { context.reset(); context.moveTo(0, 0); context.lineTo(width, 0); context.lineTo(width / 2, height); context.closePath(); context.fillStyle = control.pressed ? "#17a81a" : "#21be2b"; context.fill(); } } contentItem: Text { leftPadding: 0 rightPadding: control.indicator.width + control.spacing text: control.displayText font: control.font color: control.pressed ? "#17a81a" : "#21be2b" horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } background: Rectangle { implicitWidth: 120 implicitHeight: 40 border.color: control.pressed ? "#17a81a" : "#21be2b" border.width: control.visualFocus ? 2 : 1 radius: 2 } popup: Popup { y: control.height - 1 width: control.width implicitHeight: listview.contentHeight padding: 1 contentItem: ListView { id: listview clip: true model: control.popup.visible ? control.delegateModel : null currentIndex: control.highlightedIndex ScrollIndicator.vertical: ScrollIndicator { } } background: Rectangle { border.color: "#21be2b" radius: 2 } } }
这个之所以困扰我,就是因为再这里,我是没法当我自己定义自己的数据类型的时候,我第一个名字开始是没有想到MOdedata,我所想到的是吧text的内容设置成为这个内容,但是了,由于自己现在对QMl还是不怎么深入了解,所以也没法重新高太底层的,所以,好烦啊。
看到网友的启发,说默认的QStringList咋QLisview中,默认的键值就是modelData。所以,小脑瓜灵机一抖,把我的ListModel第一个参数就设置成为modelData,哈哈哈,是不是很聪明,就是这样,就可以实现我默认的功能了,而生下的功能就是自己加的的,后面就好实现了,当然,好实现是我心想的,但是实现起来,坑是必然的,所以我要接着去挖坑,天坑。。。。。。
下面附上我的自己的代码
import QtQuick 2.6 import QtQuick.Controls 2.1 ComboBox { id: control// model: ["First", "Second", "Third"] delegate: ItemDelegate { width: control.width contentItem: Rectangle { color:"transparent" Row { spacing: 10 Rectangle { width: parent.height height: parent.height radius: parent.height/2 color: { if(model.value == "true") { "#00FF00" } else if(model.value == "false") { "#FF0000" } } } Text { id:myText text: modelData color: "#21be2b" font: control.font elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } } } highlighted: control.highlightedIndex == index } indicator: Canvas { id: canvas x: control.width - width - control.rightPadding y: control.topPadding + (control.availableHeight - height) / 2 width: 12 height: 8 contextType: "2d" Connections { target: control onPressedChanged: canvas.requestPaint() } onPaint: { context.reset(); context.moveTo(0, 0); context.lineTo(width, 0); context.lineTo(width / 2, height); context.closePath(); context.fillStyle = control.pressed ? "#17a81a" : "#21be2b"; context.fill(); } } contentItem: Text { leftPadding: 0 rightPadding: control.indicator.width + control.spacing text: control.displayText font: control.font color: control.pressed ? "#17a81a" : "#21be2b" horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } background: Rectangle { implicitWidth: 120 implicitHeight: 40 border.color: control.pressed ? "#17a81a" : "#21be2b" border.width: control.visualFocus ? 2 : 1 radius: 2 } popup: Popup { y: control.height - 1 width: control.width implicitHeight: listview.contentHeight padding: 1 contentItem: ListView { id: listview clip: true model: control.popup.visible ? control.delegateModel : null currentIndex: control.highlightedIndex ScrollIndicator.vertical: ScrollIndicator { } } background: Rectangle { border.color: "#21be2b" radius: 2 } } }
调用部分
DLComboBox { x: 100 y:100 width: 200 height: 20 model: listmodel } ListModel { id:listmodel ListElement{modelData:"xxx";value:"true"} ListElement{modelData:"sss";value:"false"} ListElement{modelData:"ddd";value:"true"} ListElement{modelData:"fff";value:"false"} ListElement{modelData:"ggg";value:"true"} ListElement{modelData:"hhh";value:"false"} }
阅读全文
1 0
- Qt-QML-ComboBox-自定义,实现状态表示,内容可以动态正价,使用ListModel
- qml自定义Combobox
- QML中多样化的ListModel
- 使用CSS 实现状态表示
- Qt自定义QML模块
- 如何在QML应用中动态修改ListModel中的数据并存储它为JSON格式
- QML中ListView的深度订制,并利用其实现自定义ComboBox和TreeView
- Qt自定义Combobox实现列表上拉展示
- QT程序员使用QML
- qt中使用QML
- QML中多样化的ListModel(MultiDelegate)
- QML中多样化的ListModel(MultiDelegate)
- Qt-第一个QML程序-4-自定义按钮类,动画,状态
- Qt自定义动态图标的实现
- Qt:使用C++还是QML
- QT:使用C++还是QML
- Qt:使用C++还是QML
- 动态规划的状态表示
- flask ---blog 出现的问题总结
- Kafka 低级API 查看topic
- resizeTo()- 会移动的窗口
- windows 10 下sublime text 3配置c/c++编译环境
- android 教你如何导入、使用类库
- Qt-QML-ComboBox-自定义,实现状态表示,内容可以动态正价,使用ListModel
- Mysql 插入中文错误:Incorrect string value: '\xE7\xA8\x8B\xE5\xBA\x8F...' for column 'course' at row 1
- 指针
- Ubuntu14.04编译caffe问题记录
- 使用fileinput与angularjs上传文件
- kafka初认识
- 纯JAVA实现Online Judge--2.代码编译与类加载
- 删除排序链表中重复的节点 递归方式
- servlet 从java中获取参数