QML项目实战:自定义Switch按钮

时间:2024-11-06 14:10:23

目录

一.添加模块

1.QtQuick.Controls 2.1

2.QtGraphicalEffects 1.12

二.自定义Switch

三.标签

四.效果

五.代码


一.添加模块

1.QtQuick.Controls 2.1

  • QtQuick.Controls 提供了一组预定义的 UI 控件,这些控件可以用于构建现代、响应式的用户界面。
  • 它包括按钮、标签、文本框、滑块、列表视图等常见的 UI 元素。

2.QtGraphicalEffects 1.12

  • QtGraphicalEffects 提供了一组图形效果,可以在 QML 中应用到任何可视化项目上,如图像、视频或其他 UI 元素。
  • 它包括模糊、阴影、颜色调整、光照等效果。

二.自定义Switch

1.Switch 控件定义了一个自定义的指示器,根据 Switch 的状态(选中或未选中),矩形的颜色会发生变化。

2.指示器内部定义了一个滑块,它的初始位置取决于 Switch 的状态。滑块的颜色也会根据状态变化。

3.为滑块的位置变化添加了一个动画效果,使其在状态切换时平滑移动。

4.阴影效果

5.checked

三.标签

四.效果

五.代码

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 2.1
import QtGraphicalEffects 1.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Switch{
        id: _Switch
        anchors.centerIn: parent
        width: 140
        height: 50
        //checked:
        indicator: Rectangle {
            anchors.fill: parent
            width: 140
            height: 50
            radius: 25
            color: _Switch.checked ? "#2C62FF" : "#D7E1F0"
            border.width: 2
            border.color: "white"
            // border.color: _Switch.checked ? checkedColor : "#E5E5E5"
            Rectangle {
                x: _Switch.checked ? parent.width - width - 5 : 5
                width: 38
                height: width
                radius: 20
                anchors.verticalCenter: parent.verticalCenter
                color: _Switch.checked ?  " white" : "#97ACC8"

                Behavior on x {
                    NumberAnimation { duration: 200 }
                }
            }
            layer.enabled:          true
            layer.effect: DropShadow {
                verticalOffset: 4
                radius: 8
                samples: 10
                color: "#4d000f43"
            }
        }
        onCheckedChanged: {
            _Label.text = _Switch.checked
        }
    }

    Label{
        id:_Label
        anchors.top: _Switch.bottom
        anchors.topMargin: 30
        anchors.horizontalCenter: parent.horizontalCenter
        font.pixelSize: 45
        text: "我是一个标签"
    }
}