web-dev-qa-db-ja.com

QMLComboBoxアイテムのDropDownMenuスタイル

プロジェクトでComboBoxタイプを使用したいと思います。ドロップダウンメニューの外観(色、形、テキストスタイル)を変更することは可能ですか、それとも長方形、ListViewsおよびその他のタイプの組み合わせを使用する必要がありますか?

次のコードはカスタマイズを適用しますが、灰色のままのドロップダウンメニューには変更が定義されていません。

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
}
10
otashlanov

現在のパブリック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(全体的な背景)など、目的のスタイルを取得するようにカスタマイズされています。詳細については、リンクされたMenuStyleAPIを参照してください。全体的な結果:

enter image description here

このアプローチはWindowsとAndroid)では完全に機能し、OSXではコードは完全に無視されます。Qtインストール内のqmlスタイルファイルをチェックして(qml/QtQuick/Controls/Styles/Desktopのようなサブパスを検索)、Windowsで何が変更されたかを確認し、提供されたものを適応させようとします。この部分は読者に任されています。

14
BaCaRoZzo

どうもありがとう!私は次のコードでこれを解決しました:

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()
    }
}
} 

enter image description here

5
otashlanov

私はそのようなアプローチを使用してきましたが、focus管理とz-index管理には多くの制限があります。

最終的には、実際にどこかに配置するヘッダーと動的に作成するドロップダウンコンポーネントの2つの部分で構成されるComboBoxの実装になります。後者は、すべてをカバーする(そしてマウスアクティビティを傍受する)Itemと、ヘッダーの下に注意深く配置されたドロップダウンで構成されます。

コードはここに含めるのがかなり大きいので、詳細を見ることができます すべてのコードを含む私のブログ投稿で

0
Ribtoks