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

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt自定义控件大全Designer源码是一个包含了多种自定义控件的全套源码,它主要用于在Qt设计师中使用。Qt是一个跨平台的C++应用程序开发框架,提供了丰富的图形界面控件,但有时候我们可能需要自定义一些特殊的控件来满足我们的需求。 Qt自定义控件大全Designer源码包含了很多常用的自定义控件,如自定义按钮、进度、滑块、验证码输入框等等。这些控件的设计和实现已经封装好,我们只需要将源码添加到我们的项目中,然后在Qt设计师中直接使用即可。 使用Qt自定义控件大全Designer源码有以下几个优点: 1.提供了丰富的自定义控件选择:Qt自定义控件大全Designer源码包含了多样化的控件,可以满足不同项目的需求。无论是一些简单的控件,还是一些复杂的控件,我们都可以找到合适的选择。 2.减少开发时间和工作量:使用源码中的自定义控件可以减少我们从头开始设计和实现的工作,节省了大量的开发时间和工作量。我们只需要将源码添加到项目中并正确配置,就可以直接在设计师中使用这些自定义控件。 3.提高应用程序的美观性和用户体验:Qt自定义控件大全Designer源码中的控件经过精心设计和实现,具有良好的界面效果和用户交互体验。使用这些自定义控件可以为我们的应用程序提供更加美观和友好的界面。 总之,Qt自定义控件大全Designer源码是一个提供了多种自定义控件的全套源码,使用它可以快速、方便地实现各种自定义控件,提高应用程序的开发效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值