Skip to content

ElaSlider 组件文档 ​

概述 ​

ElaSlider 是一个现代化的滑块组件,继承自 QSlider。它提供了自定义样式、动画效果、主题适配等特性。

特性 ​

  • 自定义样式
  • 动画效果
  • 主题适配
  • 平滑滑动
  • 圆形滑块
  • 渐变滑槽
  • 悬浮效果
  • 点击定位

构造函数 ​

cpp
// 基础构造
explicit ElaSlider(
    QWidget* parent = nullptr
);

// 指定方向构造
explicit ElaSlider(
    Qt::Orientation orientation, 
    QWidget* parent = nullptr
);

样式系统 ​

滑块样式 ​

cpp
void drawComplexControl(
    ComplexControl control, 
    const QStyleOptionComplex* option, 
    QPainter* painter, 
    const QWidget* widget
) const override {
    // 绘制滑槽
    painter->setBrush(
        ElaThemeColor(themeMode, BasicChute)
    );
    painter->drawRoundedRect(...);
    
    // 绘制已滑过区域
    painter->setBrush(
        ElaThemeColor(themeMode, PrimaryNormal)
    );
    painter->drawRoundedRect(...);
    
    // 绘制滑块
    painter->setBrush(
        ElaThemeColor(themeMode, BasicBase)
    );
    painter->drawEllipse(...);
}

动画效果 ​

cpp
void startRadiusAnimation(
    qreal startRadius, 
    qreal endRadius, 
    QWidget* widget
) const {
    // 创建动画
    auto animation = new QPropertyAnimation(
        this, 
        "circleRadius"
    );
    
    // 设置动画属性
    animation->setEasingCurve(
        QEasingCurve::InOutSine
    );
    animation->setStartValue(startRadius);
    animation->setEndValue(endRadius);
    
    // 启动动画
    animation->start(
        QAbstractAnimation::DeleteWhenStopped
    );
}

使用示例 ​

基础用法 ​

1. 创建滑块 ​

cpp
// 创建水平滑块
ElaSlider* slider = 
    new ElaSlider(Qt::Horizontal, this);

// 设置范围
slider->setRange(0, 100);

// 设置步长
slider->setSingleStep(1);

// 设置页步长
slider->setPageStep(10);

2. 值处理 ​

cpp
// 连接值变化信号
connect(slider, 
    &ElaSlider::valueChanged,
    this, [=](int value) {
    // 处理值变化
});

// 设置当前值
slider->setValue(50);

// 获取当前值
int value = slider->value();

高级用法 ​

1. 自定义外观 ​

cpp
// 设置方向
slider->setOrientation(Qt::Vertical);

// 设置刻度位置
slider->setTickPosition(
    QSlider::TicksBothSides
);

// 设置刻度间隔
slider->setTickInterval(10);

2. 事件处理 ​

cpp
// 鼠标按下事件
void mousePressEvent(
    QMouseEvent* event
) override {
    if (event->button() == Qt::LeftButton) {
        // 计算点击位置对应的值
        double pos = event->pos().x() / 
            (double)width();
        setValue(minimum() + 
            (maximum() - minimum()) * pos);
    }
}

样式定制 ​

1. 尺寸设置 ​

cpp
int pixelMetric(
    PixelMetric metric,
    const QStyleOption* option,
    const QWidget* widget
) const override {
    switch (metric) {
    case PM_SliderLength:
        return 20;
    case PM_SliderThickness:
        return 20;
    default:
        break;
    }
    return QProxyStyle::pixelMetric(
        metric, 
        option, 
        widget
    );
}

2. 行为设置 ​

cpp
int styleHint(
    StyleHint hint,
    const QStyleOption* option,
    const QWidget* widget,
    QStyleHintReturn* returnData
) const override {
    if (hint == SH_Slider_AbsoluteSetButtons) {
        return Qt::LeftButton;
    }
    return QProxyStyle::styleHint(
        hint, 
        option, 
        widget, 
        returnData
    );
}

注意事项 ​

  1. 继承自 QSlider
  2. 自动处理主题切换
  3. 智能内存管理
  4. 事件处理
  5. 性能优化
  6. 主题适配
  7. 样式继承
  8. 动画流畅

最佳实践 ​

  1. 合理设置范围
  2. 优化步进值
  3. 控制动画时长
  4. 注意性能
  5. 统一交互
  6. 保持一致
  7. 动画流畅
  8. 响应式布局

相关组件 ​

  • QSlider: 基类
  • ElaSliderStyle: 样式组件
  • ElaTheme: 主题系统
  • QPropertyAnimation: 动画系统