Skip to content

Switch - Material 开关 ​

Switch 是 Material Design 3 开关(Toggle)控件的完整实现,带有动画滑块位置、轨道颜色过渡和状态层。提供 CheckBox 的替代方案,适用于二进制开/关设置。

类参考 ​

cpp
namespace cf::ui::widget::material;

class Switch : public QCheckBox {
    Q_OBJECT
};

头文件:ui/widget/material/widget/switch/switch.h

基本用法 ​

cpp
#include "widget/material/widget/switch/switch.h"

using namespace cf::ui::widget::material;

// 创建不带文本的开关
auto* toggle = new Switch(this);

// 创建带文本的开关
auto* wifiSwitch = new Switch("Wi-Fi", this);
wifiSwitch->setChecked(true);

// 连接信号(与 QCheckBox 兼容)
connect(wifiSwitch, &QCheckBox::toggled, this, &MyClass::onWifiToggled);

开关尺寸 ​

Switch 遵循 Material Design 3 的尺寸规范:

元素尺寸
轨道宽度52dp
轨道高度32dp
滑块直径选中时更大
轨道圆角完全圆角(高度的一半)

滑块动画 ​

开关切换时,滑块从一侧滑动到另一侧,有平滑的位移动画:

cpp
// m_thumbPosition 从 0.0(未选中/左侧)到 1.0(选中/右侧)
// 动画由 CFMaterialAnimationFactory 驱动

toggle->setChecked(true);   // 滑块从左滑到右
toggle->setChecked(false);  // 滑块从右滑到左

内部使用 m_inNextCheckState 标志防止 setChecked() 在状态切换时直接跳过动画。

轨道颜色 ​

轨道颜色根据选中状态自动切换:

状态轨道颜色滑块颜色
UncheckedSurfaceVariantOnSurface (带 outline)
CheckedPrimaryOnPrimary

交互状态 ​

状态视觉效果
Normal默认轨道和滑块
Hovered状态层叠加 + 滑块扩展
Pressed水波纹 + 状态层
Focused焦点环
Disabled38% 透明度

与 CheckBox 的区别 ​

特性CheckBoxSwitch
视觉形式方形勾选框圆形滑块 + 轨道
适用场景多选列表单项开/关设置
状态切换勾选/取消勾选滑动动画
触摸目标48x48dp52x32dp

根据 Material Design 3 的建议,开关适用于即时生效的设置项(如 Wi-Fi 开关),而复选框适用于需要确认的多选项。

绘制流程 ​

Switch 的 paintEvent 实现以下绘制步骤:

  1. 绘制轨道(drawTrack) - 带颜色过渡
  2. 绘制滑块(drawThumb) - 带位置动画
  3. 绘制水波纹(drawRipple)
  4. 绘制文本(drawText)
  5. 绘制焦点指示器(drawFocusIndicator)

主要方法 ​

方法说明
setChecked(bool)设置选中状态,触发滑块位移动画
hitButton(const QPoint&)整个控件区域可点击
sizeHint() / minimumSizeHint()获取推荐/最小尺寸

信号 ​

信号说明
继承自 QCheckBoxtoggled, clicked, stateChanged 等

相关文档 ​

Built with VitePress