Qt自定义控件——绘制滑动条
通过继承QWidget来重写paintEvent函数来绘制图形,目前已实现功能有鼠标拖动、鼠标滚动等方式改变滑动条。功能简陋 源码链接:https://download.youkuaiyun.com/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.youkuaiyun.com/download/qq_42401265/13196393