跳转到内容

NRangeSlider 范围滑块

介绍

范围滑块用于选择一个数值范围。NRangeSlider 提供了两个可拖动的滑块,用户可以通过拖动来选择最小值和最大值,支持水平和竖直方向。

基本用法

cpp
// 创建范围滑块
NRangeSlider* rangeSlider = new NRangeSlider();

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

// 设置初始值
rangeSlider->setValues(20, 80);

// 获取当前值
QPair<int, int> values = rangeSlider->values();
qDebug() << "下限:" << values.first << "上限:" << values.second;

// 监听值变化
connect(rangeSlider, QOverload<int>::of(&NRangeSlider::lowerValueChanged), 
        [](int value) {
    qDebug() << "下限已改变:" << value;
});

connect(rangeSlider, QOverload<int>::of(&NRangeSlider::upperValueChanged), 
        [](int value) {
    qDebug() << "上限已改变:" << value;
});

connect(rangeSlider, QOverload<int, int>::of(&NRangeSlider::rangeChanged), 
        [](int lower, int upper) {
    qDebug() << "范围已改变:" << lower << "-" << upper;
});

水平范围滑块

cpp
// 创建水平范围滑块
NRangeSlider* horizontalSlider = new NRangeSlider(Qt::Horizontal);

// 设置范围
horizontalSlider->setRange(0, 100);
horizontalSlider->setValues(25, 75);

// 监听变化
connect(horizontalSlider, QOverload<int, int>::of(&NRangeSlider::rangeChanged),
        [](int lower, int upper) {
    qDebug() << "选择范围:" << lower << "-" << upper;
});

竖直范围滑块

cpp
// 创建竖直范围滑块
NRangeSlider* verticalSlider = new NRangeSlider(Qt::Vertical);

// 设置范围
verticalSlider->setRange(0, 100);
verticalSlider->setValues(30, 70);

// 设置高度
verticalSlider->setMinimumHeight(200);

// 监听变化
connect(verticalSlider, QOverload<int, int>::of(&NRangeSlider::rangeChanged),
        [](int lower, int upper) {
    qDebug() << "选择范围:" << lower << "-" << upper;
});

价格范围选择

cpp
// 创建价格范围选择器
QWidget* priceFilter = new QWidget();
QVBoxLayout* layout = new QVBoxLayout(priceFilter);

// 标题
QLabel* titleLabel = new QLabel("价格范围");
titleLabel->setStyleSheet("font-weight: bold;");
layout->addWidget(titleLabel);

// 范围滑块
NRangeSlider* priceSlider = new NRangeSlider(Qt::Horizontal);
priceSlider->setRange(0, 10000);
priceSlider->setValues(1000, 5000);
layout->addWidget(priceSlider);

// 显示价格范围
QLabel* priceLabel = new QLabel();
auto updatePriceLabel = [=]() {
    QPair<int, int> values = priceSlider->values();
    priceLabel->setText(QString("¥%1 - ¥%2").arg(values.first).arg(values.second));
};

connect(priceSlider, QOverload<int, int>::of(&NRangeSlider::rangeChanged),
        [=](int lower, int upper) {
    updatePriceLabel();
});

layout->addWidget(priceLabel);
updatePriceLabel();

时间范围选择

cpp
// 创建时间范围选择器
QWidget* timeFilter = new QWidget();
QVBoxLayout* layout = new QVBoxLayout(timeFilter);

// 标题
QLabel* titleLabel = new QLabel("时间范围(小时)");
layout->addWidget(titleLabel);

// 范围滑块
NRangeSlider* timeSlider = new NRangeSlider(Qt::Horizontal);
timeSlider->setRange(0, 24);
timeSlider->setValues(8, 18);
layout->addWidget(timeSlider);

// 自定义格式化函数
timeSlider->setTooltipFormatter([](int value) {
    return QString("%1:00").arg(value, 2, 10, QChar('0'));
});

// 显示时间范围
QLabel* timeLabel = new QLabel();
auto updateTimeLabel = [=]() {
    QPair<int, int> values = timeSlider->values();
    timeLabel->setText(QString("%1:00 - %2:00")
        .arg(values.first, 2, 10, QChar('0'))
        .arg(values.second, 2, 10, QChar('0')));
};

connect(timeSlider, QOverload<int, int>::of(&NRangeSlider::rangeChanged),
        [=](int lower, int upper) {
    updateTimeLabel();
});

layout->addWidget(timeLabel);
updateTimeLabel();

自定义工具提示

cpp
// 创建范围滑块
NRangeSlider* slider = new NRangeSlider(Qt::Horizontal);
slider->setRange(0, 100);
slider->setValues(30, 70);

// 启用工具提示
slider->setShowTooltip(true);

// 自定义工具提示格式
slider->setTooltipFormatter([](int value) {
    return QString::number(value) + "%";
});

自定义样式

cpp
// 创建范围滑块
NRangeSlider* slider = new NRangeSlider(Qt::Horizontal);

// 设置轨道高度
slider->setTrackHeight(6);

// 设置滑块大小
slider->setThumbDiameter(20);
slider->setThumbInnerDiameter(12);

// 设置圆角
slider->setTrackCornerRadius(3);

// 自定义颜色
slider->setLightTrackColor(QColor(230, 230, 230));
slider->setLightProgressColor(QColor(0, 120, 215));
slider->setLightThumbOuterColor(QColor(255, 255, 255));

slider->setDarkTrackColor(QColor(60, 60, 60));
slider->setDarkProgressColor(QColor(0, 150, 255));
slider->setDarkThumbOuterColor(QColor(200, 200, 200));

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

禁用状态

cpp
// 创建范围滑块
NRangeSlider* slider = new NRangeSlider(Qt::Horizontal);
slider->setRange(0, 100);
slider->setValues(30, 70);

// 禁用滑块
slider->setEnabled(false);

// 自定义禁用状态颜色
slider->setLightDisabledTrackColor(QColor(240, 240, 240));
slider->setLightDisabledProgressColor(QColor(200, 200, 200));
slider->setDarkDisabledTrackColor(QColor(50, 50, 50));
slider->setDarkDisabledProgressColor(QColor(80, 80, 80));

键盘控制

cpp
// 创建范围滑块
NRangeSlider* slider = new NRangeSlider(Qt::Horizontal);
slider->setRange(0, 100);
slider->setValues(30, 70);

// 设置焦点
slider->setFocus();

// 使用键盘控制:
// 左/上箭头:减小值
// 右/下箭头:增大值
// Tab:切换焦点到另一个滑块

范围限制

cpp
// 创建范围滑块
NRangeSlider* slider = new NRangeSlider(Qt::Horizontal);

// 设置范围
slider->setRange(10, 90);

// 设置初始值(会被限制在范围内)
slider->setValues(5, 95);  // 实际会被设置为 10, 90

// 获取实际值
QPair<int, int> values = slider->values();
qDebug() << "实际值:" << values.first << "-" << values.second;

API

构造函数

构造函数说明
NRangeSlider(QWidget* parent = nullptr)创建水平范围滑块
NRangeSlider(Qt::Orientation orientation, QWidget* parent = nullptr)创建指定方向的范围滑块

范围和值

方法说明参数/返回值
setRange(int min, int max)设置范围最小值、最大值
setValues(int lower, int upper)设置下限和上限下限值、上限值
values()获取当前值返回 QPair<int, int>
setMinimum(int min)设置最小值最小值
minimum()获取最小值返回 int
setMaximum(int max)设置最大值最大值
maximum()获取最大值返回 int
setLowerValue(int value)设置下限值下限值
lowerValue()获取下限值返回 int
setUpperValue(int value)设置上限值上限值
upperValue()获取上限值返回 int

方向

方法说明参数/返回值
setOrientation(Qt::Orientation orientation)设置方向Qt::HorizontalQt::Vertical
orientation()获取方向返回 Qt::Orientation

样式属性

属性说明类型
trackHeight轨道高度int
thumbDiameter滑块直径int
thumbInnerDiameter滑块内部直径int
trackCornerRadius轨道圆角半径int

颜色属性

属性说明类型
lightTrackColor明亮主题轨道色QColor
darkTrackColor暗黑主题轨道色QColor
lightProgressColor明亮主题进度色QColor
darkProgressColor暗黑主题进度色QColor
lightThumbOuterColor明亮主题滑块外色QColor
darkThumbOuterColor暗黑主题滑块外色QColor

工具提示

方法说明参数/返回值
setShowTooltip(bool show)启用/禁用工具提示布尔值
showTooltip()获取是否显示工具提示返回 bool
setTooltipFormatter(std::function<QString(int)> formatter)设置工具提示格式化函数格式化函数

信号

信号说明参数
lowerValueChanged(int value)下限值已改变新的下限值
upperValueChanged(int value)上限值已改变新的上限值
rangeChanged(int lower, int upper)范围已改变新的下限值、新的上限值

主题定制

范围滑块会自动响应应用主题变化,支持明亮和暗黑主题的自动切换。

基于 LGPL-3.0 许可发布