我想在我的项目中使用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并尝试适应提供的解决方案.这部分留给读者.