Qt之QDoubleSlider 继承QSlider的双向滑块

44 篇文章 209 订阅 ¥29.90 ¥99.00
本文介绍了Qt中如何实现双向滑块控制,推荐了Qt Extension Library中的QxtSpanSlider,并对其进行了美化改造,衍生出QDoubleSlider。QDoubleSlider允许用户自定义样式,但存在一些限制,例如无法通过qss改变两滑块中间的样式。源码链接已提供。
摘要由CSDN通过智能技术生成

简述

        Qt自带的QSlider滑块控件只能是单向的控制阈值,某些情况下要使得可以左右上限可调控的话只能是使用两个或者多个QSlider,但是也有很多是朋友是通过继承QWidget自写了一个可调控的双向滑块,虽然能满足需求,但是样式、性能等方面也许有所不足,这里我推荐一个Qt的第三方控件库Qt Extension Library,其中包含了一个对QSlider的重写类QxtSpanSlider,这个类满足了需求。但是如果给继承了这个类的控件设置了样式后那就有问题了,所以我在QxtSpanSlider基础上稍作了些修改使得其看上去更加美观。

QxtSpanSlider

        QxtSpanSlider只是Qt Extension Library其中之一,先来看看其效果:

如果您不想通过继承`QSlider`来自定义拖动条,可以通过继承`QWidget`并使用`QPainter`类来手动绘制。具体步骤如下: 1. 创建一个继承自`QWidget`的类,例如`CustomSlider`。 2. 在`CustomSlider`的构造函数中设置一些必要的属性,例如拖动条的最小值、最大值和当前值。 3. 重写`paintEvent`函数,在该函数中使用`QPainter`类来手动绘制拖动条。 4. 重写`mousePressEvent`和`mouseMoveEvent`函数,以便用户可以通过鼠标拖动手柄来改变当前值。 以下是一个示例实现: ```cpp class CustomSlider : public QWidget { Q_OBJECT public: CustomSlider(QWidget *parent = nullptr) : QWidget(parent), m_minValue(0), m_maxValue(100), m_currentValue(50) {} void setRange(int minValue, int maxValue) { m_minValue = minValue; m_maxValue = maxValue; update(); } void setValue(int value) { m_currentValue = qBound(m_minValue, value, m_maxValue); update(); } protected: void paintEvent(QPaintEvent *event) override { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 绘制滑轨 QRectF trackRect(0, height() / 2 - 2, width(), 4); painter.setPen(QPen(Qt::gray, 4)); painter.drawLine(trackRect.topLeft(), trackRect.topRight()); // 绘制已选择的部分 QRectF selectedRect(0, height() / 2 - 2, width() * (m_currentValue - m_minValue) / (m_maxValue - m_minValue), 4); painter.setPen(QPen(Qt::blue, 4)); painter.drawLine(selectedRect.topLeft(), selectedRect.topRight()); // 绘制手柄 QRectF handleRect(selectedRect.right() - 8, height() / 2 - 12, 16, 24); painter.setPen(Qt::NoPen); painter.setBrush(Qt::white); painter.drawEllipse(handleRect); painter.setBrush(Qt::gray); painter.drawEllipse(handleRect.adjusted(2, 2, -2, -2)); } void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { setValue(m_minValue + (m_maxValue - m_minValue) * event->pos().x() / width()); event->accept(); } else { event->ignore(); } } void mouseMoveEvent(QMouseEvent *event) override { if (event->buttons() & Qt::LeftButton) { setValue(m_minValue + (m_maxValue - m_minValue) * event->pos().x() / width()); event->accept(); } else { event->ignore(); } } private: int m_minValue; int m_maxValue; int m_currentValue; }; ``` 在上面的示例中,我们通过重写`paintEvent`函数来手动绘制滑轨、已选择的部分和手柄。然后,在`mousePressEvent`和`mouseMoveEvent`函数中处理鼠标事件,以便用户可以通过鼠标拖动手柄来改变当前值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ilson_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值