Flat风格的Qml组合框

  • 2019 年 12 月 16 日
  • 笔记

基于Qml的ComboBox控件修改而成。

组合框代码

import QtQuick 2.0  import QtQuick.Controls 2.0  import QtGraphicalEffects 1.0    ComboBox {      id: root        property color checkedColor: "#1ABC9C"        delegate: ItemDelegate {          width: root.width            contentItem: Text {              text: modelData              color: root.highlightedIndex === index ? "white" : "black"              font.family: "Arial"              elide: Text.ElideRight              verticalAlignment: Text.AlignVCenter          }            background: Rectangle {               width: parent.width               height: parent.height               color: root.highlightedIndex === index ? root.checkedColor : "#F3F4F5"           }      }        indicator: Canvas {          id: canvas          x: root.width - width - 10          y: (root.availableHeight - height) / 2          width: 12          height: 8          contextType: "2d"            Connections {              target: root              onPressedChanged: canvas.requestPaint()          }            onPaint: {              context.reset();              context.moveTo(0, 0);              context.lineTo(width, 0);              context.lineTo(width / 2, height);              context.closePath();              context.fillStyle = "white"              context.fill();          }      }        contentItem: Item {          width: root.background.width - root.indicator.width - 10          height: root.background.height            Text {              anchors.verticalCenter: parent.verticalCenter              x: 10              text: root.displayText              elide: Text.ElideRight                font.pixelSize: 15              font.family: "Arial"              font.weight: Font.Thin              color: root.down ? Qt.rgba(255, 255, 255, 0.75) : "white"          }      }        background: Rectangle {          implicitWidth: 102          implicitHeight: 41          color: root.down ? Qt.darker(root.checkedColor, 1.2) : root.checkedColor          radius: 5            layer.enabled: root.hovered | root.down          layer.effect: DropShadow {              transparentBorder: true              color: root.checkedColor              samples: 10 /*20*/          }      }        popup: Popup {          y: root.height - 1          width: root.width          implicitHeight: contentItem.implicitHeight          padding: 0            contentItem: ListView {              implicitHeight: contentHeight              model: root.popup.visible ? root.delegateModel : null              clip: true              currentIndex: root.highlightedIndex                ScrollIndicator.vertical: ScrollIndicator { }          }            background: Rectangle {              color: "#F3F4F5"              radius: 5              clip: true                layer.enabled: root.hovered | root.down              layer.effect: DropShadow {                  transparentBorder: true                  color: "#F3F4F5"                  samples: 10              }          }      }  }

组合框样式代码

GridLayout {      width: root.width      rows: 3      columns: 3        Repeater {          id: comboboxRepeater          model: ["#727CF5", "#0ACF97", "#F9375E",                  "#FFBC00", "#2B99B9", "#5A6268",                  "#EEF2F7", "#212730", "#3498DB"]            ComboBox {              model: ["First", "Second", "Third"]              checkedColor: modelData          }      }  }