当前位置:网站首页>Qt滚动条(QScrollBar)圆角样式问题跟踪
Qt滚动条(QScrollBar)圆角样式问题跟踪
2022-08-10 05:39:00 【KumaNPC】
Qt使用样式表设置圆角滚动条的黑色背景问题
今天在知乎上看到一篇文章,描述使用样式表设置圆角滚动条时,圆角四周会有黑色区域而非透明,文章里最后借用 QSlider 来实现圆角滚动条。
我好奇 Qt 居然会出现这样的Bug,就研究了一下,顺便做个记录。
设置圆角样式:
QScrollBar 有一些子控件区域,handle 为滑块, add-line、sub-line 默认是滚动条两侧箭头区域,add-page、sub-page 是滑块两侧区域,使用以下样式表设置圆角,除了滑块与主背景,都设置为透明:
QScrollBar:horizontal{
background: #309AB8;
border-radius: 15px;
min-height: 30px;
max-height: 30px;
}
QScrollBar::handle:horizontal{
background: #FFFFFF;
border-radius: 15px;
min-width: 30px;
}
QScrollBar::add-page, QScrollBar::sub-page{
background: transparent;
}
QScrollBar::add-line, QScrollBar::sub-line{
background: transparent;
}
结果如下图所示,确实周围出现黑色像素:
原因跟踪:
一开始尝试调整子控件的样式,无解,而且圆角四周会出现奇怪的刷新问题。
重写 QScrollBar::paintEvent,使用老方法自绘。发现即使不绘制子控件,也是会有黑色像素,调试源码猜测是绘制边框的问题。
在样式表里设置一下 “border: 1px solid transparent”,黑色像素居然没有了,只不过边框歪歪扭扭对不齐。
调试源码又看不明白源码是怎么绘制边框的,便在 paintEvent 什么都不做,发现整个滚动条区域居然都是黑色的: 
这种情况在 Qt 中并不多见,经常自绘或者写无边框窗口总会遇到,无非是几个特定属性,查看 QScrollBar 源码的构造函数发现:
尝试手动关闭该属性,黑色背景消失。
解决方案:
所以,根本原因在 Qt::WA_OpaquePaintEvent 被默认开启了,关闭掉就行了。测试过程中发现设置 “border-style: solid;”也可以解决,可以根据情况实际自己选择。
原理分析:
到此已经解决了问题,不过有两个问题还需要再回答。
- Qt::WA_OpaquePaintEvent 代表什么意思?
文档里解释,该属性指示窗口在收到重绘事件时会绘制整个区域,可以避免重绘前频繁擦除背景,在不支持双缓冲技术的系统上减少闪烁之类的。而黑色实际是Windows窗口管理系统上的空颜色。
所以开启该属性后,因为样式的圆角,圆角外的区域没有按规则绘制有效像素,所以就是黑色的。 - 设置 border-style 能解决的原因是什么?
因为该样式会关闭 Qt::WA_OpaquePaintEvent 属性,可以通过 QWidget::testAttribute 验证。
在Qt的源码里,QStyleSheetStyle::polish 也有对应的逻辑:
判断比较多,该例子中在 rule.boder()->isOpaque() 里面有对 border 样式判断,solid 样式恰好返回了 false,如果没有设置则是 none,可能返回true,具体其他情况就没有详细研究。
边栏推荐
- Unity导航与寻路系统的基本使用
- 如何在VMlogin中设置YiLu代理?
- UnityShader入门精要-unity shader基础
- Explore the origin of the garbled problem: the association between GBK, UTF8, UTF16, UTF8BOM, and ASN1
- Talking about 3 common shadow rendering techniques in games (1): plane shadow
- UnityShader入门精要--Unity中的基础光照
- 动态规划、背包问题 6/26 116-120
- UnityShader入门精要-基础纹理
- 动态规划、背包问题 6/23 101-105
- 为什么游戏需要热更新
猜你喜欢

【备份】《Unity Shader入门精要》配图

Qt绘制椭圆曲线的角度问题(离心角和旋转角)

Talking about 3 Common Shadow Rendering Techniques in Games (3): Shadow Mapping

npm搭建私服,上传下载包

Myunity框架笔记
网页安全证书错误但无法安装证书的解决办法

Hypervisor, KVM, QEMU总结

unity瓦片地图调整图片大小

R language cluster analysis - code analysis

Can‘t find bundle for base name jdbc, locale zh_CN解决方法
随机推荐
Mysql表数据在命令行窗口下中文乱码问题解决方法
UnityShader入门精要-纹理动画、顶点动画
OpenGL学习笔记(LearnOpenGL)-第二部分 绘制三角形
UnityShader入门精要-渲染纹理 镜子 玻璃 效果
Hypervisor, KVM, QEMU总结
21天学习挑战赛--分班
废水中氟离子去除方法
21天学习挑战赛--字符串切割
个人实现的可任意折叠QToolBox——AdvancedToolBox
如何实现网格建造系统
UE 游戏模式
分享一个专业TA的《Shader参考大全》
Unity血条跟随对象
指纹浏览器在使用易路代理时常见的问题及解决办法
qemu and host share disk
视差映射:更逼真的纹理细节表现(上):为什么要使用视差映射
pthread编程重要知识点
新手使用 go channel 需要注意的问题
MySQL 免安装版/解压版的安装与配置(Win & Unix & Linux)
Unity资源热更新--资源管理、Addressable