问题描述
我想在项目中使用 ComboBox
类型.是否可以更改下拉菜单的外观(颜色,形状,文本样式),还是需要组合使用矩形, ListView
s和其他类型?
I want to use the ComboBox
type in my project. Is it possible to change the appearance of the drop-down menu (color, shape, text style) or do I need to use a combination of rectangles, ListView
s and other types?
以下代码应用了自定义功能,但未为灰色的下拉菜单定义任何修改:
The following code applies customizations but no modification is defined for the drop-down menu which remains gray:
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不允许自定义此处. Qt 5.4
,即 Styles 1.3
,刚刚引入了一些属性以自定义字体和文本(docs 此处),但仍然没有公开访问下拉自定义项的权限.
The current public APIs does not allow customization of the drop-down menu as stated here. Qt 5.4
, i.e. Styles 1.3
, just introduced some properties to customize fonts and text (docs here) but still no public access to drop-down customization.
此外,链接中提供的示例不适用于更新版本的Qt.这是我已经使用Qt 5.3,Qt 5.4和Qt 5.5测试的修改版本(请记住将 import QtQuick.Controls.Private 1.0
添加到导入):
Also, the example provided in the link does not work with the newer versions of Qt. Here is a modified version I've tested with Qt 5.3, Qt 5.4 and Qt 5.5 (remember to add import QtQuick.Controls.Private 1.0
to the imports):
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
(定义组合框内项目的外观)和 frame
(整个背景).有关更多详细信息,请参考链接的 MenuStyle
API.总体结果:
Here __dropDownStyle
is assigned with a MenuStyle
type. Some properties of such type are customized to obtain the desired style, in particular itemDelegate
(which defines the appearance of an item inside the combobox) and frame
(overall background). Refer to the linked MenuStyle
APIs for more details. Overall result:
请注意,此方法在Windows和Android上非常有效 ,而在OSX上,代码被完全忽略.可以检查Qt安装中的qml样式文件(搜索诸如 qml/QtQuick/Controls/Styles/Desktop
之类的子路径),以查看w.r.t有什么变化.Windows并尝试调整提供的解决方案.这部分留给读者.
Note that this approach does perfectly work on Windows and Android whereas on OSX the code is completely ignored. One can check the qml style file inside the Qt installation (search for a subpath like qml/QtQuick/Controls/Styles/Desktop
) to see what changes w.r.t. Windows and try to adapt the provided solution. This part is left up to the reader.
这篇关于QML ComboBox项目DropDownMenu样式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!