QT控件样式系列(一)之QSlider

系列文章目录

最近做QT开发,项目做的很急,很多东西都是直接百度之后直接拿来用,根本没认真看,现在有空了来整理一波,主要记录控件常用样式,方便后续查阅



前言

该篇记录QSlider常用的样式,我都是用的贴图,第一部分可以跳过,是我在网上搜索的样式


一、通用QT样式

1.QSS文本属性

属性描述
color设置文本的颜色
direction规定文本的方向/书写方向
letter-spacing设置字符间距
line-height设置行高
text-align规定文本的水平对齐方式
text-decoration添加到文本的装饰效果
text-indent规定文本块首行的缩进
text-shadow规定添加到文本的阴影效果

2.QSS背景属性

属性描述
background在一个声明中设置所有的背景属性
background-attachment设置背景图像是否固定或者随着页面的其余部分滚动
background-color设置元素的背景颜色
background-image设置元素的背景图像
background-position设置背景图像的开始位置
background-repeat设置是否及如何重复背景图像
background-clip规定背景的绘制区域

3.QSS边框属性

属性描述
border在一个声明中设置所有的边框属性
border-bottom在一个声明中设置所有的下边框属性
border-bottom-color设置下边框颜色
border-bottom-style设置下边框样式
border-bottom-width设置下边框的宽度
border-color设置四条变量的颜色
border-left/right/top同理,在一个声明中设置所有的左/右/上边框属性

4.QSS Box 属性

属性描述
overflow-x如果内容溢出了元素内容区域,是否对内容的左/右边缘进行裁剪
overflow-y如果内容溢出了元素内容区域,是否对内容的上/下边缘进行裁剪
overflow-style规定溢出元素的首选滚动方法
border-bottom-style设置下边框样式
rotation围绕由 rotation-point 属性定义的点对元素进行旋转
rotation-point定义距离上左边框边缘的偏移点

5.QSS 字体属性

属性描述
font在一个声明中设置所有的字体属性
font-family规定文本的字体系列
font-size规定文本的字体尺寸
font-size-adjust为元素规定 aspect 值
font-stretch收缩或拉伸当前的字体系列
font-style规定文本的字体样式
font-variant规定是否以小型大写字母的字体显示文本
font-weight规定字体的粗细

6.QSS 外边框属性

属性描述
margin在一个声明中设置所有外边距属性
margin-bottom设置元素的下外边距
margin-left设置元素的左外边距
margin-right设置元素的右外边距
margin-top设置元素的上外边距

7.QSS 内边框属性

属性描述
padding在一个声明中设置所有内边距属性
padding-bottom设置元素的下内边距
padding-left设置元素的左内边距
padding-right设置元素的右内边距
padding-top设置元素的上内边距

8.QSS 位置属性

属性描述
bottom设置定位元素下外边距边界与其包含块下边界之间的偏移
clear规定元素的哪一侧不允许其他浮动元素
clip裁剪绝对定位元素
cursor规定要显示的光标的类型(形状)
display规定元素应该生成的框的类型
float规定元素应该生成的框的类型
left设置定位元素左外边距边界与其包含块左边界之间的偏移
overflow规定当前内容溢出元素框时发生的事件

二、QSlider样式组成

1、主体

设置背景图片,简单直接,一张图就行了,样式如下:

/*设置背景*/
QSlider{border-image: url(:/image/sk_h_bg.png);}

效果图如下,背景、字体这些就用不到了,其他的参数:最大/小宽高就不用多讲了吧
在这里插入图片描述

2、滑动槽的部分

样式如下,设置滑动槽的范围,并设置白色边框,方便展示

/*滑动槽的部分*/
QSlider::groove:horizontal {
	border: 1px solid white;
	height:	6px;
	width: 261px;
}

效果图如下,白色部分就是滑条的区域,白色边框如果不要就将 1px 改为 0px 就行,不能去掉border这个边框属性设置,该参数很重要,等会添加滑条的背景图片显示的就是这个区域;
在这里插入图片描述

3、滑过与未滑过的部分

样式如下,分别添加已划过与为划过的背景图片,高度与上边滑块区域对应;切记,背景图片设置使用border-image,因为滑块在滑动时,已划过区域与未划过区域一直在变,border-image会自动拉升图片填充整个区域

/*已滑过的槽部分*/
QSlider::sub-page:horizontal {
	border-image: url(:/image/bar_dn.png);
	height: 6px;
}

/*未滑过的槽部分*/
QSlider::add-page:horizontal {
	border-image: url(:/image/bar_up.png);
	height: 6px;
}

已滑过与未划过背景图片如下:
在这里插入图片描述
在这里插入图片描述
效果图如下,不是很明显,等会添加滑条运行出来效果就明显了;
在这里插入图片描述

4、滑块

样式如下,添加背景图片,设置滑块的宽高

/*滑块*/
QSlider::handle:horizontal 
{
	border-image: url(:/image/thumb_upp.png);
	width: 32px;
	height: 32px;
}

效果图如下,什么鬼,高度设置完全没用,滑块宽度设置生效了,高度设置完全没用,和滑动槽的区域一样,也就是 6px;
在这里插入图片描述
显然这不满足需求,所以你需要使用margin属性,样式和效果图如下:

/*滑块*/
QSlider::handle:horizontal 
{
	border-image: url(:/image/thumb_upp.png);
	width: 32px;
	margin: -14px  0px -14px 0px; 
}

在这里插入图片描述
效果就出来了,为什么呢?margin设置的是边缘属性,四个参数分别对应上右下左4个方向的边距尺寸,如果为负数,则往外扩张放大,滑块高度是 32px,所以 -(32px - 6px) / 2 = -14px,配合border-image自动填充效果就出来了,同理,左右两个属性设置就不要多讲了吧,分别设置滑块起始位置和滑块滑到头的位置

5、最终效果

来张动图,白色边框可以去掉,最好将图片大小和控件大小统一,我这Demo随便设置尺寸了;另外,这水印无解,非我本意,有大佬给推荐一个好用的录屏软件么
请添加图片描述
PS:竖的滑动条样式同理,宽高互调,就不多说了


三、QSlider使用

下次再写…


总结

简单记录了一下自己的一些开发过程中的理解,有错误的地方欢迎大家指正,持续更新…

  • 19
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 可以通过继承QSlider类并重写paintEvent()函数来自定义QSlider滑动条,同时可以通过设置QStyleOptionSlider中的subControls属性来设置滑块的形状为圆形。具体实现可以参考以下代码: ``` class CustomSlider : public QSlider { public: CustomSlider(QWidget *parent = nullptr) : QSlider(parent) { setStyleSheet("QSlider::groove:horizontal { height: 10px; background: #ddd; }" "QSlider::handle:horizontal { width: 20px; border-radius: 10px; background: #333; }"); } protected: void paintEvent(QPaintEvent *event) override { QSlider::paintEvent(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QStyleOptionSlider opt; initStyleOption(&opt); QRect grooveRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this); QRect handleRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); QPoint center = handleRect.center(); painter.setPen(Qt::NoPen); painter.setBrush(QColor("#333")); painter.drawEllipse(center, handleRect.width() / 2, handleRect.height() / 2); } }; ``` 在上述代码中,我们通过设置QSlider样式表来设置滑动条的样式,其中groove表示滑动条的轨道,handle表示滑块。在paintEvent()函数中,我们首先调用QSlider的paintEvent()函数来绘制默认的滑动条,然后获取滑动条的轨道和滑块的矩形区域,并计算出滑块的中心点。最后,我们使用QPainter绘制一个圆形,将其填充为黑色,并以滑块的中心点为圆心,滑块宽度的一半为半径进行绘制,从而实现了圆形滑块的效果。 ### 回答2: QT是一款跨平台的C++图形用户界面应用程序开发框架。在QT中,我们可以自定义QSlider滑动条以及滑块的形状。 要自定义QSlider滑动条,首先我们需要创建一个自定义的滑动条类,继承QSlider。在该类中,我们可以重写一些QSlider的虚函数,如paintEvent()、sliderChange()等,以实现自定义的滑动条样式和功能。 要实现圆形的滑块,我们可以通过设置滑块样式表来实现。在QSlider的子类中,通过重写paintEvent()函数,我们可以在滑动条上绘制自定义的滑块。 以下是一个自定义的QSlider滑动条,滑块为圆形的示例代码: ```cpp class CustomSlider : public QSlider { Q_OBJECT public: CustomSlider(QWidget *parent = nullptr) : QSlider(parent) { setStyleSheet("QSlider::handle {" " background: green;" " border-radius: 8px;" " width: 16px;" " height: 16px;" "}"); } protected: void paintEvent(QPaintEvent *event) override { QSlider::paintEvent(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); QRect grooveRect = style()->subControlRect(QStyle::CC_Slider, this, QStyle::SC_SliderGroove, this); int x = grooveRect.x() + grooveRect.height() / 2 - 8; int y = grooveRect.y() + grooveRect.height() / 2 - 8; painter.setBrush(QColor(51, 153, 255)); painter.setPen(Qt::NoPen); painter.drawEllipse(QRect(x, y, 16, 16)); } }; ``` 在上述代码中,我们重写了CustomSlider的构造函数和paintEvent()函数。构造函数中通过设置样式表,将滑块的背景设为绿色,圆角半径设为8px,并设置滑块的大小为16x16px。paintEvent()函数中,我们通过获取滑动条的轨道区域,计算滑块的位置,然后绘制一个蓝色圆形作为滑块。 我们可以在应用程序中使用CustomSlider类来替代QSlider类,从而实现自定义的滑动条和圆形滑块。 ### 回答3: 要自定义QSlider滑动条,使滑块圆形,可以通过重写QStyle类的drawComplexControl方法来实现。具体步骤如下: 1. 创建一个继承自QStyle的自定义样式类,并重写drawComplexControl方法。 2. 在drawComplexControl方法中,首先调用父类的drawComplexControl方法,这样可以绘制默认样式的滑块。 3. 获取滑块的矩形区域,并将其设置为圆形。 4. 根据滑块的圆形矩形区域,绘制一个圆形。 5. 最后,将自定义样式类应用到QSlider控件上。 下面是实现上述步骤的示例代码: ```C++ #include <QtWidgets> class CustomSliderStyle : public QStyle { public: using QStyle::QStyle; void drawComplexControl(ComplexControl control, const QStyleOptionComplex* option, QPainter* painter, const QWidget* widget = nullptr) const override { if (control == CC_Slider && option->subControls == SC_SliderHandle) { QStyleOptionSlider opt = *qstyleoption_cast<const QStyleOptionSlider*>(option); // 绘制默认样式的滑块 QStyle::drawComplexControl(control, option, painter, widget); // 获取滑块的矩形区域 QRect grooveRect = subControlRect(CC_Slider, option, SC_SliderHandle, widget); QRect handleRect = opt.rect; // 将滑块的矩形区域设置为圆形 handleRect.setSize(QSize(handleRect.width(), handleRect.width())); handleRect.moveCenter(grooveRect.center()); // 绘制圆形滑块 painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); painter->setPen(Qt::NoPen); painter->setBrush(opt.palette.buttonText()); painter->drawEllipse(handleRect); painter->restore(); } else { QStyle::drawComplexControl(control, option, painter, widget); } } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); QSlider slider; CustomSliderStyle customStyle; slider.setStyle(&customStyle); slider.show(); return app.exec(); } ``` 通过以上代码,可以自定义QSlider滑动条,使滑块变为圆形。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li_Zhi_Yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值