Qt自定义控件——绘制滑动条

Qt自定义控件——绘制滑动条

通过继承QWidget来重写paintEvent函数来绘制图形,目前已实现功能有鼠标拖动、鼠标滚动等方式改变滑动条。功能简陋 源码链接:https://download.csdn.net/download/qq_42401265/13196393
在这里插入图片描述
主要代码展示:
头文件

#ifndef MYSLIDER_H
#define MYSLIDER_H

#include <QWidget>
#include <QPainter>
#include <QLabel>
#include <QColor>
#include <QMouseEvent>

class MySlider : public QWidget
{
    
    
    enum SetSelectColor {
    
    
        BaseColor,
        CoverColor,
        SliderButtonMarginColor,
        SliderButtonColor
    };

    Q_OBJECT
public:
    explicit MySlider(QWidget *parent = nullptr);
    ~MySlider();
    void setValue(int value);
    void setMinValue(int value);
    void setMaxValue(int value);
    int getValue() const;
    void setColor(QColor color, MySlider::SetSelectColor select);

protected:
    void paintEvent(QPaintEvent *ev) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;
signals:

public slots:

private:
    int m_minValue;
    int m_maxValue;
    int m_value;
    int m_width;
    int m_height;
    int m_moveStepSize;//移动步长
    //int m_posToButtonX;//间隙
    int m_lineL;
    int m_posButtonx;

    QColor m_baseColor;//底色
    QColor m_coverColor;//覆盖底色
    QColor m_SliderButtonMarginColor;//滑动按钮边缘颜色
    QColor m_SliderButtonMarginColor_T;//滑动按钮边缘颜色
    QColor m_SliderButtonColor;//滑动按钮填充颜色

    QLabel *m_minLabel;//显示最小的区间
    QLabel *m_midLabel;//显示滑动的值
    QLabel *m_maxLabel;//显示最大区间

    bool m_press;//鼠标按下

    void drawSliderLine(QPainter &paninter);
    void drawSliderButton(QPainter &paninter);
    void drawCoverLine(QPainter &paninter);
    void drawInit();
};

#endif // MYSLIDER_H

主要函数:

void MySlider::paintEvent(QPaintEvent *ev)
{
    
    
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);//抗锯齿
    drawInit();
    drawSliderLine(painter);
    drawCoverLine(painter);
    drawSliderButton(painter);
}

void MySlider::mousePressEvent(QMouseEvent *event)
{
    
    
    if(event->button() == Qt::LeftButton)
    {
    
    
        int x_pos = event->x();
        int y_pos = event->y();
        if(x_pos >= m_posButtonx && \
           x_pos <= m_posButtonx+m_lineL/25 && \
           y_pos >= m_height/4 && \
           y_pos <= (m_height/4) + (m_height/2))
        {
    
    
            //m_posToButtonX = 0;
            m_press = true;
        }

    }

}

void MySlider::mouseReleaseEvent(QMouseEvent *event)
{
    
    
    m_press = false;
}

void MySlider::mouseMoveEvent(QMouseEvent *event)
{
    
    
    int x_pos = event->x();
    int y_pos = event->y();
    if(x_pos >= m_posButtonx && \
       x_pos <= m_posButtonx+m_lineL/25 && \
       y_pos >= m_height/4 && \
       y_pos <= (m_height/4) + (m_height/2))
    {
    
    
        m_SliderButtonMarginColor = m_SliderButtonColor;
    }
    else
    {
    
    
        m_SliderButtonMarginColor = m_SliderButtonMarginColor_T;
    }

    if(m_press)
    {
    
    
        //int begin_pos_x = x_pos - m_minLabel->width() - m_posToButtonX;
        int begin_pos_x = x_pos - m_minLabel->width();
        if(begin_pos_x < 0)
            begin_pos_x = 0;
        else if(begin_pos_x > m_lineL)
            begin_pos_x = m_lineL;
        setValue(((double)begin_pos_x/(double)m_lineL)*(m_maxValue - m_minValue) + m_minValue);

    }
    update();
}

void MySlider::wheelEvent(QWheelEvent *event)
{
    
    
    if(!m_press)
    {
    
    
        int value_t = m_value;
        if(event->delta() > 0)// 当滚轮远离使用者时
        {
    
    
            setValue(++value_t);
        }
        else// 当滚轮向使用者方向旋转时
        {
    
    
            setValue(--value_t);
        }
        update();
    }
}

void MySlider::drawInit()
{
    
    
    m_height = this->height();
    m_width = this->width();
    m_minLabel->setText(QString::number(m_minValue));
    m_maxLabel->setText(QString::number(m_maxValue));
    m_midLabel->setText(QString::number(m_value));
    m_lineL = m_width-m_maxLabel->width()-m_minLabel->width();
    m_posButtonx = ((double)(m_lineL-m_lineL/25)/(double)(m_maxValue-m_minValue)) * (m_value-m_minValue)+m_minLabel->width();
}

void MySlider::drawSliderLine(QPainter &paninter)
{
    
    
    m_minLabel->move(0,(m_height/2)-m_minLabel->height()-m_height/10);
    m_maxLabel->move(m_width-m_maxLabel->width(),(m_height/2)-m_minLabel->height()-m_height/10);
    paninter.save();
    QPen pen(m_baseColor);
    pen.setWidth(m_height/5);
    pen.setCapStyle(Qt::FlatCap);
    paninter.setPen(pen);
    paninter.drawLine(m_minLabel->width(), m_height/2, m_width-m_maxLabel->width(), m_height/2);
    paninter.restore();
}

void MySlider::drawSliderButton(QPainter &paninter)
{
    
    
    paninter.save();
    QPen qPen(m_SliderButtonMarginColor);
    qPen.setWidth(2);   //设置画笔的粗细
    paninter.setPen(qPen);
    paninter.setBrush(QBrush(m_SliderButtonColor));

    paninter.drawRoundRect(m_posButtonx, \
                           m_height/4, \
                           m_lineL/25, \
                           (m_height/2),50,50);
    m_midLabel->move(m_posButtonx, \
                     (m_height/4-m_midLabel->height()));
    paninter.restore();
}

void MySlider::drawCoverLine(QPainter &paninter)
{
    
    
    paninter.save();
    QPen pen(m_coverColor);
    pen.setWidth(m_height/5);
    pen.setCapStyle(Qt::FlatCap);
    paninter.setPen(pen);
    paninter.drawLine(m_minLabel->width(), \
                      m_height/2, \
                      m_posButtonx, \
                      m_height/2);
    paninter.restore();
}

源码链接:https://download.csdn.net/download/qq_42401265/13196393

猜你喜欢

转载自blog.csdn.net/qq_42401265/article/details/110230820