一、概述
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的优先