プロジェクトでComboBox
タイプを使用したいと思います。ドロップダウンメニューの外観(色、形、テキストスタイル)を変更することは可能ですか、それとも長方形、ListView
sおよびその他のタイプの組み合わせを使用する必要がありますか?
次のコードはカスタマイズを適用しますが、灰色のままのドロップダウンメニューには変更が定義されていません。
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 here )、ドロップダウンカスタマイズへのパブリックアクセスはまだありません。
また、リンクで提供されている例は、Qtの新しいバージョンでは機能しません。これは、Qt 5.3、Qt 5.4、およびQt 5.5でテストした変更バージョンです(インポートにimport 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
(コンボボックス内のアイテムの外観を定義する)およびframe
(全体的な背景)など、目的のスタイルを取得するようにカスタマイズされています。詳細については、リンクされたMenuStyle
APIを参照してください。全体的な結果:
このアプローチはWindowsとAndroid)では完全に機能し、OSXではコードは完全に無視されます。Qtインストール内のqmlスタイルファイルをチェックして(qml/QtQuick/Controls/Styles/Desktop
のようなサブパスを検索)、Windowsで何が変更されたかを確認し、提供されたものを適応させようとします。この部分は読者に任されています。
どうもありがとう!私は次のコードでこれを解決しました:
Item {
id: app
width: 200
height: 150
ListModel{
id: dataModel
ListElement{ name: "Day" }
ListElement{ name: "Week" }
ListElement{ name: "Month" }
ListElement{ name: "Year" }
}
Button {
id: comboButton
width: parent.width
height: parent.height / 5
checkable: true
style: ButtonStyle {
background: Rectangle {
color: control.pressed ? "#888" : "#fff"
smooth: true
radius: 5
border.width: 2
Image {
source: "pics/corner.png"
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.bottomMargin: 5
anchors.rightMargin: 5
}
}
label: Text {
renderType: Text.NativeRendering
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
font.family: "Courier"
font.capitalization: Font.SmallCaps
font.pointSize: 15
color: "black"
text: "Day"
}
}
onVisibleChanged: {
if(!visible)
checked = false
}
}
TableView {
id: tableView
height: 120
width: parent.width
anchors.bottom: parent.bottom
highlightOnFocus: true
headerVisible: false
visible: comboButton.checked ? true : false
TableViewColumn {
role: "name"
}
model: dataModel
itemDelegate: Item {
Rectangle {
color: styleData.selected ? "#888" : "#fff"
height: comboButton.height - 0.5
border.width: 0.5
width: parent.width
Text {
renderType: Text.NativeRendering
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
font.family: "Courier"
font.capitalization: Font.SmallCaps
font.pointSize: 15
color: "black"
elide: styleData.elideMode
text: styleData.value
}
}
}
rowDelegate: Item {
height: comboButton.height - 0.5
}
onClicked: {
comboButton.checked = false
tableView.selection.clear()
}
}
}
私はそのようなアプローチを使用してきましたが、focus
管理とz-index
管理には多くの制限があります。
最終的には、実際にどこかに配置するヘッダーと動的に作成するドロップダウンコンポーネントの2つの部分で構成されるComboBox
の実装になります。後者は、すべてをカバーする(そしてマウスアクティビティを傍受する)Item
と、ヘッダーの下に注意深く配置されたドロップダウンで構成されます。
コードはここに含めるのがかなり大きいので、詳細を見ることができます すべてのコードを含む私のブログ投稿で