Stylesheet

一、概述

qt使用了stylesheet来改变控件的外观,使用了独特的qss语法,功能异常强大
可以在designer中直接改每个控件的sytle,也可以进行批量修改
如果进行批量修改就等同于换皮肤
而且在designer中修改后可以直接看到更改过后的样式,非常直观

理解style的核心是The Box Model

任何一个控件都是这四个rect的叠加
对于默认style,外围三项的宽为0所以看不到任何内容
修改style就是针对这4项进行修改

注意这里说的style不是指Qstyle,使用Qstyle需要派生类,比较复杂
stylesheet提供了一种简单的方法,而且可以更强大

详细文档可见http://doc.qt.io/qt-5/stylesheet.html
这里给出一些操作实例和解释。

二、初步尝试修改button

拖入一个button,右键

进入修改界面

这里提供了一些常用的属性,特别是跟颜色有关的,可以弹出调色盘直接选

设置成这样运行:

背景确实变化了,但是我们设置了边框颜色并没有显示,为什么?
如果记得box模型就知道默认外围的3个rect都是0宽度,所以需要设置

效果:点击apply

但是这样更改后点击按钮图像上不会有任何反应,我们还需要增加style

看起来有些复杂,语法待会会讲解,这里大概可以看出有两个样式:第一个给button指定,第二个给button:pressed指定。(注:截图有误,应该是只有一个:)

运行效果:

鼠标按压变成红色

下面再试试添加图片

资源使用了硬盘上的图片,相对路径
效果:

成功了

三、qss语法浅析

在体验了style的基本功能后,一个自然的问题就是那些关键字和语法形式是哪来的?
到底能够改变多少属性?

http://doc.qt.io/qt-5/stylesheet-syntax.html
http://doc.qt.io/qt-5/stylesheet-reference.html

官方文档在这里,有需要随时查。这里讲讲自己的理解

最基础的语法:
ClassName {	
	key: value;
	key: value;
}

{}前面的叫做Selector,作用是限定style范围
{}里面的叫declaration,作用是设置属性

Selector有几种写法,不过最常用的是class selector,即指定类名,然后所有类的实例都受到影响
另一个常用的是指明obj的名字用#,比如QPushButton#okButton

对于复杂的类,其内部还有类,可以使用
ClassName::SubControls来限定范围,比如QComboBox::drop-down就作用于下拉框

一般来说控件都有自己独特的状态,可以使用ClassName:State来限定某种状态,比如QPushButton:hover
注意这里是一个:
另外还可以使用!表达逻辑否,使用chainning表达逻辑与。比如QPushButton:hover:!pressed
不过还是尽量避免过于复杂的限定为好

对于冲突情况,原则是更加具体的style优先,明确指定了style的优先