我想在我的项目中使用ComboBox类型.是否可以改变下拉菜单的外观(颜色,形状,文字样式),还是需要使用矩形,ListView和其他类型的组合?
ComboBox { currentIndex: 2 activeFocusOnPress: true style: ComboBoxStyle { id: comboBox background: Rectangle { id: rectCategory radius: 5 border.width: 2 color: "#fff" Image { source: "pics/corner.png" anchors.bottom: parent.bottom anchors.right: parent.right anchors.bottomMargin: 5 anchors.rightMargin: 5 } } label: Text { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pointSize: 15 font.family: "Courier" font.capitalization: Font.SmallCaps color: "black" text: control.currentText } } model: ListModel { id: cbItems ListElement { text: "Banana" } ListElement { text: "Apple" } ListElement { text: "Coconut" } } width: 200 }
解决方法
目前的公共API不允许自定义下拉菜单,如
here.Qt 5.4,即Styles 1.3,刚刚介绍了一些属性来自定义字体和文本(docs
here),但仍然没有公共访问下拉式定制.
此外,链接中提供的示例不适用于较新版本的Qt.这是一个使用Qt 5.3,Qt 5.4和Qt 5.5进行测试的修改版本(请记住将QtQuick.Controls.Private 1.0导入导入):
ComboBox { id: Box currentIndex: 2 activeFocusOnPress: true style: ComboBoxStyle { id: comboBox background: Rectangle { id: rectCategory radius: 5 border.width: 2 color: "#fff" } label: Text { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pointSize: 15 font.family: "Courier" font.capitalization: Font.SmallCaps color: "black" text: control.currentText } // drop-down customization here property Component __dropDownStyle: MenuStyle { __maxPopupHeight: 600 __menuItemType: "comboBoxitem" frame: Rectangle { // background color: "#fff" border.width: 2 radius: 5 } itemDelegate.label: // an item text Text { verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pointSize: 15 font.family: "Courier" font.capitalization: Font.SmallCaps color: styleData.selected ? "white" : "black" text: styleData.text } itemDelegate.background: Rectangle { // selection of an item radius: 2 color: styleData.selected ? "darkGray" : "transparent" } __scrollerStyle: ScrollViewStyle { } } property Component __popupStyle: Style { property int __maxPopupHeight: 400 property int submenuOverlap: 0 property Component frame: Rectangle { width: (parent ? parent.contentWidth : 0) height: (parent ? parent.contentHeight : 0) + 2 border.color: "black" property real maxHeight: 500 property int margin: 1 } property Component menuItemPanel: Text { text: "NOT IMPLEMENTED" color: "red" font { pixelSize: 14 bold: true } } property Component __scrollerStyle: null } } model: ListModel { id: cbItems ListElement { text: "Banana" } ListElement { text: "Apple" } ListElement { text: "Coconut" } } width: 200 }
这里__dropDownStyle被分配了MenuStyle
类型.这种类型的某些属性被定制以获得期望的样式,特别是itemDelegate(其定义了组合框内的项目的外观)和框架(整体背景).有关详细信息,请参阅链接的MenuStyle API.总体结果:
请注意,这种方法在Windows和Android上完美工作,而在OSX上,代码完全被忽略.可以检查Qt安装中的qml样式文件(搜索像qml / QtQuick / Controls / Styles / Desktop这样的子路径)来查看w.r.t.的更改. Windows并尝试适应提供的解决方案.这部分留给读者.