做者:刘旭晖 Raymond 转载请注明出处
Email:colorant@163.com
BLOG:http://blog.csdn.net/colorant/css
除了子类化Style类,使用QT样式表(QStyleSheet)是另外一种快速改变QT程序UI风格的方法,它很大程度上借鉴和参考了HTML层叠样式表的语法和思想。其效果叠加在Style的基础上html
按官方文档的说法,QT样式表目前只能和内置Style配合工做,和子类化的Style的配合正在开发中app
StyleSheet 文件的默认后缀名为qss,能够经过命令行参数 -stylesheet filename.qss 来设置样式表,也能够经过QApplication::setStyleSheet 或 QWidget::setStyleSheet来设置应用程序或特定控件要使用的样式表函数
::setStyleSheet 函数的参数是字符串(不是qss文件的名字,而是样式表的内容),因此直接使用的话,不方便一次设置大量的规则,可是可使用资源文件将qss样式表嵌入 到程序中,而后经过QApplication::setStyleSheet来使用,例如:字体
这里不打算详细解释,只是举例说明,具体的语法规则,请参考 http://qt.nokia.com/doc/4.6/stylesheet-syntax.htmlspa
一条样式表的描述规则可能相似这样:.net
一条样式表规则由选择器 (Selector)和属性定义(declaration)组成。命令行
这部分是选择器,用于指定样式表规则的应用对象,细分开来:代理
以上除了第一个字段,都不是必须,而是进一步限制规则适用范围htm
这部分是属性定义,由成对的属性名:属性值组成,用;分隔。
由于样式表规则的层级关系比较复杂,另外设置的方式也有不少,有时候会发生多条规则都和某一个具体控件相关的状况,这样具体哪一条样式表规则最终被应用到控件的UI表现上,就须要有一个规则来定义,大体上牵涉到这个问题的状况有以下几种
规则冲突
多条规则制定了不一样的内容,可能的状况有不少,好比
QPushButton:hover { color: white }
QPushButton { color: red }
这种状况,其实能够不算冲突,更加具体的类型描述符定义的规则拥有更高优先级,因此一个有鼠标悬停的按钮的文本颜色就是白色的,不然为红色
QPushButton:hover { color: white }
QPushButton:enabled { color: red }
这里就可能发生规则冲突,当一个使能的按钮有鼠标悬停的时候,颜色的定义是什么呢? QStyleSheet的判断原则是,后面规则的优先级高于前面的规则,因此这种状况颜色为红色
QPushButton { color: red }
QAbstractButton { color: gray }
这 个相对难发现,一个基类及其子类都定义了针对文本颜色的规则,那么子类应用哪一条规则呢?你可能会认为天然是子类用本身的规则了,很惋惜不是,样式表不考 虑类的继承层级优先关系,因此仍是后一条规则优先级高于前一条规则。若是确实要单独设定子类的规则,须要交换规则的顺序。
样式表层叠 Cascading
由于样式表能够应用在QApplication上,也能够单独应用在控件上,因此最终应用到一个具体控件的样式表,是经过叠加合并全部的父控件乃至应用程序的样式表设定来获得的。这种状况下,也有可能发生规则冲突, 例如:
这种状况下,控件自身的样式表的优先级高于父控件或应用程序的样式表
样式表继承 Inheritance
在标准的CSS样式表中,一个控件的字体和颜色属性若是没有明确设定,那么将自动继承自父控件,而在QT的样式表中,不会自动继承,例如:
qApp->setStyleSheet("QGroupBox { color: red; } ");
这种状况下,对于GroupBox中的添加的子控件,不会自动设置其颜色属性,若是要设置子控件的属性,须要明确设定:
qApp->setStyleSheet("QGroupBox, QGroupBox * { color: red; }");
注意,这里的继承和上面的层叠不同,层叠指不一样样式表设置同一个对象,继承指的则是样式表规则中选择器对控件层级关系的影响
当 设置StyleSheet的时候,一个QStyleSheetStyle会被生成并被设为应用程序实际的Style,而当前的Style则被 reparent成QStyleSheetStyle的子对象,当应用程序或控件调用Style绘图的时候,实际调用的是 QStyleSheetStyle对象,在QStyleSheetStyle类内部,会先调用函数按照StyleSheet定义的规则绘制UI,若是没有 相关规则,再调用当前的Style对象的绘图函数绘制UI,因此QStyleSheet做为一个代理Style先对UI进行处理。
Trackback:http://qimo601.iteye.com/blog/1634788