QSlider自定义样式

效果

在这里插入图片描述

一、样式表设置

QSlider::groove:horizontal { 
	border: 1px solid gray;
	height: 2px; 
	left: 8px; 
	right: 8px; 
} 

QSlider::handle:horizontal { 
	border: 1px solid gray; 
	background:white;
	border-radius: 5px;
	width: 10px; 
	height: 10px; 
	margin: -5px; 
} 

QSlider::add-page:horizontal{ 
	background: rgb(189, 189, 189); 
} 
QSlider::sub-page:horizontal{ 
	background: rgb(80, 165, 245); 
}

在这里插入图片描述

二、绘制刻度

QSlider默认设置了样式表后不能显示刻度,所以要自己重写paintEvent来绘制。
用QSlider派生一个自定义控件类。

class Slider : public QSlider
{
    Q_OBJECT

public:
    explicit Slider(QWidget *parent = nullptr);
    ~Slider();
    void addScale(int value);

private:
    Ui::Slider *ui;
    QVector<int> m_scales;	//刻度列表

protected:
    void paintEvent(QPaintEvent *event) override;
};

函数实现。

void Slider::addScale(int value)
{
    m_scales << value;
}

void Slider::paintEvent(QPaintEvent *event)
{
    QSlider::paintEvent(event);	//绘制滑动条

	/* 设置刻度路径 */
    QPainterPath path;		  //刻度路径
    QPainterPath textPath;    //刻度值的文字路径
	int length = width();
	int centerY = height() / 2.0;	//Y方向上的中点
    double eachValueSpan = (double)length / (maximum() - minimum());
    for (int value : m_scales) {
        int x = eachValueSpan * (value - minimum());
      
      	/* 添加刻度 */
        path.moveTo(x, centerY);
        path.lineTo(x, centerY - 4);

		/* 添加刻度值 */
        QString text = QString::number(value);
        int textWidth = fontMetrics().width(text);
        int textheight = fontMetrics().height();
        textPath.addText(x - textWidth / 2.0, height() - textheight / 2.0, font(), text);
    }

	/* 绘制路径 */
    QPainter painter(this);
    QPen pen;
    
    pen.setColor(Qt::gray);
    pen.setWidth(2);
    painter.setPen(pen);
    painter.drawPath(path);

    pen.setColor(Qt::black);
    pen.setWidth(1);
    painter.setPen(pen);
    painter.drawPath(textPath);
}

在这里插入图片描述

三、偏移问题

使用以上代码后会发现,刻度存在偏移,我们看回第一节样式设置。

QSlider::groove:horizontal { 
	border: 1px solid gray;
	height: 2px; 
	left: 8px; 
	right: 8px; 
} 
...

为了留出空间给圆形滑块,把滑动条中间的沟槽左边和右边都偏移了8px,而绘制刻度的时候没有将它考虑进去,那么怎么在代码中获取到偏移量呢?
Qt的样式绘制都是通过QStyle及其类实现的,查看源码qcommonstyle.cpp。
在这里插入图片描述
可以看到,使用subControlRect,传入CC_Slider、SC_SliderHandle、SC_SliderGroove能拿到滑动条各部件的尺寸和位置。
对第二节的代码进行修改。

void Slider::paintEvent(QPaintEvent *event)
{
    QSlider::paintEvent(event);

	/* 设置刻度路径 */
    QPainterPath path;		  //刻度路径
    QPainterPath textPath;    //刻度值的文字路径

    QStyleOptionSlider option;
    initStyleOption(&option);
    auto r = style()->proxy()->subControlRect(QStyle::CC_Slider, &option, QStyle::SC_SliderGroove, this);
    int startX = r.x();	//进度条起始位置的x坐标
    int centerY = r.y(), length = r.width() - 1;
    double eachValueSpan = (double)length / (maximum() - minimum());
    for (int value : m_scales) {
        int x = startX + eachValueSpan * (value - minimum());

      	/* 添加刻度 */
        path.moveTo(x, centerY);
        path.lineTo(x, centerY - 4);

		/* 添加刻度值 */
        QString text = QString::number(value);
        int textWidth = fontMetrics().width(text);
        int textheight = fontMetrics().height();
        textPath.addText(x - textWidth / 2.0, height() - textheight / 2.0, font(), text);
    }

	/* 绘制路径 */
    QPainter painter(this);
    QPen pen;
    
    pen.setColor(Qt::gray);
    pen.setWidth(2);
    painter.setPen(pen);
    painter.drawPath(path);

    pen.setColor(Qt::black);
    pen.setWidth(1);
    painter.setPen(pen);
    painter.drawPath(textPath);
}

最终显示正确的刻度。
在这里插入图片描述

总结

以后需要自绘控件时,可以参考QCommonStyle的实现。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义QSlider滑块的样式,你可以使用Qt样式表(QSS)来实现。以下是一些常见的QSlider滑块样式的示例代码: 1. 修改滑块的颜色和大小: ```cpp QSlider::handle { background-color: #4CAF50; /* 设置滑块的背景色 */ width: 20px; /* 设置滑块的宽度 */ height: 20px; /* 设置滑块的高度 */ margin: -10px 0; /* 将滑块居中显示 */ border-radius: 10px; /* 设置滑块的圆角 */ } ``` 2. 修改滑轨的颜色和高度: ```cpp QSlider::groove { background-color: #f1f1f1; /* 设置滑轨的背景色 */ height: 6px; /* 设置滑轨的高度 */ } ``` 3. 修改滑轨上已选择部分的颜色: ```cpp QSlider::sub-page { background-color: #4CAF50; /* 设置已选择部分的背景色 */ } ``` 4. 修改滑轨上未选择部分的颜色: ```cpp QSlider::add-page { background-color: #CCCCCC; /* 设置未选择部分的背景色 */ } ``` 可以根据需要自定义这些样式属性,然后将其应用到QSlider上。例如,使用`setStyleSheet`函数将样式表应用到QSlider对象上: ```cpp QSlider* slider = new QSlider(Qt::Horizontal); slider->setStyleSheet("QSlider::handle { background-color: #4CAF50; width: 20px; height: 20px; margin: -10px 0; border-radius: 10px; }" "QSlider::groove { background-color: #f1f1f1; height: 6px; }" "QSlider::sub-page { background-color: #4CAF50; }" "QSlider::add-page { background-color: #CCCCCC; }"); ``` 这些只是一些示例,你可以根据自己的需求进行更多的自定义。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值