qss样式(qt style sheet)无法生效的原因
[TOC]
继承于QWidget却未重写paintEvent(QPaintEvent *e)函数
在qss的官方文档中对于QWidget的介绍如下
Supports only the background, background-clip and background-origin properties.
If you subclass from QWidget, you need to provide a paintEvent for your custom >QWidget as below:
对于一个QWidget,它仅仅支持设置背景色的qss,如果一个继承于QWidget的子类想要支持其他的qss,就需要像重新实现paintEvent函数。
QWidget只支持background、background-clip和background-origin属性。
未正确添加Q_OBJECT宏
由于qss是通过Qt的元对象系统(The Meta-Object System)支持,因而需要在头文件中private块中添加Q_OBJECT宏。
qss生效但被子控件遮挡
这一种情况在对容器类空间,如QWidget,QFrame等,对于这类控件设置qss时尤其得注意qss效果是否会被子部件遮挡,尤其注意边框是否挡住。
父控件或者它的父控件在代码中设置了stylesheet,导致子控件设置的样式无效。
两种解决办法
- 把父窗口的样式放到qss文件中
- 在代码中设置子控件的样式setstylesheet
其他qss样式文件相关问题
- qss样式文件中设置样式的上方包含语法错误,导致下面的样式都失效了
在qss文件中,如果某个样式之前设置样式语法错误,可能导致后面的样式都设置不成功。
- qss的文件格式不是UTF-8,导致读取到的文件中字符串出现乱码。
其他代码设置样式问题
- qss是父子关系的时候是可以传递的。单纯的继承关系不是父子关系,所以继承不具备传递
- 重新设置样式时,有可能之前的样式没有去除,导致旧样式一直生效
解决办法unpolish() 后再polish();