【Qt】自定义的可拖动的Slider

由于QSlider鼠标点一下是固定移动一定的位置。我想要的效果是鼠标点哪里,滑块就跳到哪里。所以继承QWidget自己实现了一个这样的Slider,都是用QPainter绘制出来的,对应的取值是自己算的,大小写死了,只实现了水平方向的。这里稍作记录。

先看下效果,这里录制动图没有把鼠标录进去:

下面直接贴代码:

.h文件:

#ifndef SLIDERWIDGET_H
#define SLIDERWIDGET_H

#include <QWidget>
#include <QMouseEvent>

class SliderWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SliderWidget(int w, int h, QWidget *parent = 0);

    void setMaxVal(qreal val);
    void setMinVal(qreal val);
    void setVal(qreal val);

    qreal getCurVal() const;
    qreal getMinVal() const;
    qreal getMaxVal() const;

protected:
    void paintEvent(QPaintEvent *e);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

private:
    void getCurPoint(QMouseEvent *event);

signals:
    void sigPositonChange(qreal curVal);

private:
    QPoint m_curPoint;
    qreal m_maxVal;
    qreal m_minVal;
    qreal m_curVal;
};

#endif // SLIDERWIDGET_H

.cpp文件:

#include "sliderwidget.h"

#include <QPainter>

SliderWidget::SliderWidget(int w, int h, QWidget *parent):
    QWidget(parent), m_maxVal(100), m_minVal(0)
{
    this->setFixedSize(w, h);
    m_curPoint = QPoint(11, 0);
}

void SliderWidget::setMaxVal(qreal val)
{
    m_maxVal = val;
}

void SliderWidget::setMinVal(qreal val)
{
    m_minVal = val;
}

void SliderWidget::setVal(qreal val)
{
    m_curVal = val;
    int posX = (this->width() - 22)*(m_curVal - m_minVal)/(m_maxVal - m_minVal) + 11;
    m_curPoint = QPoint(posX, 0);
    update();
}

qreal SliderWidget::getCurVal() const
{
    return m_curVal;
}

qreal SliderWidget::getMinVal() const
{
    return m_minVal;
}

qreal SliderWidget::getMaxVal() const
{
    return m_maxVal;
}

void SliderWidget::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);
    painter.setBrush(QColor(39,105,188));
    painter.setPen(Qt::NoPen);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawRoundedRect(QRect(0, this->height()/5*2, m_curPoint.x(),
                                  this->height()/5), 4, 4);
    painter.setBrush(QColor(206, 206, 206));
    painter.drawRoundedRect(QRect(m_curPoint.x(), this->height()/5*2, this->width() - m_curPoint.x(),
                                  this->height()/5), 4, 4);
    QPen pen;
    pen.setWidth(2);
    pen.setColor(QColor(206, 206, 206));
    painter.setBrush(Qt::white);
    painter.setPen(pen);
    painter.drawEllipse(QPointF(m_curPoint.x(), this->height()/2), 10, 10);

}

void SliderWidget::mousePressEvent(QMouseEvent *event)
{
    getCurPoint(event);
}

void SliderWidget::mouseMoveEvent(QMouseEvent *event)
{
    getCurPoint(event);
}

void SliderWidget::getCurPoint(QMouseEvent *event)
{
    if(event->pos().x() < 11)
    {
        m_curPoint = QPoint(11, 0);
    }
    else if(event->pos().x() > this->width() - 11)
    {
        m_curPoint = QPoint(this->width() - 11, 0);
    }
    else
    {
        m_curPoint = event->pos();
    }
    update();


    m_curVal = (qreal)(m_curPoint.x() - 11)/(this->width() - 22)*(m_maxVal - m_minVal) + m_minVal;
    emit sigPositonChange(m_curVal);
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值