【转】QT样式表 (QStyleSheet)
作者:刘旭晖 Raymond 转载请注明出处
Email:colorant@163.com
BLOG:http://blog.csdn.net/colorant/
除了子类化Style类,使用QT样式表(QStyleSheet)是另一种快速改变QT程序UI风格的方法,它很大程度上借鉴和参考了HTML层叠样式表的语法和思想。其效果叠加在Style的基础上
按官方文档的说法,QT样式表目前只能和内置Style配合工作,和子类化的Style的配合正在开发中
StyleSheet的使用
StyleSheet
文件的默认后缀名为qss,可以通过命令行参数 -stylesheet filename.qss
来设置样式表,也可以通过QApplication::setStyleSheet 或
QWidget::setStyleSheet来设置应用程序或特定控件要使用的样式表
::setStyleSheet
函数的参数是字符串(不是qss文件的名字,而是样式表的内容),所以直接使用的话,不方便一次设置大量的规则,但是可以使用资源文件将qss样式表嵌入
到程序中,然后通过QApplication::setStyleSheet来使用,例如:
- QFile file(":/qss/mystylesheet.qss");
- file.open(QFile::ReadOnly);
- app.setStyleSheet(file.readAll());
样式表语法
这里不打算详细解释,只是举例说明,具体的语法规则,请参考 http://qt.nokia.com/doc/4.6/stylesheet-syntax.html
一条样式表的描述规则可能类似这样:
- QComboBox#myComboBox::down-arrow:pressed {
- position: relative;
- top: 1px; left: 1px;
- }
一条样式表规则由选择器 (Selector)和属性定义(declaration)组成。
- QComboBox#myComboBox::down-arrow:pressed
这部分是选择器,用于指定样式表规则的应用对象,细分开来:
- QComboBox#myComboBox 这一部分叫类型选择器(Type Selector),QComboBox指定了对象类名,#name指定对象的实例名(非必须)其它的选择器语法请参考官方文档。
- down-arrow 子控件描述符(subcontrol),和前面的字段用::隔开,这里表示组合框的下拉按键
- pressed 伪状态(Pseudo-States)描述符,和前面的字段用:隔开,这里表示压下状态
以上除了第一个字段,都不是必须,而是进一步限制规则适用范围
- {
- position: relative;
- top: 1px; left: 1px;
- }
这部分是属性定义,由成对的属性名:属性值组成,用;分隔。
样式表规则的范围和优先级关系
因为样式表规则的层级关系比较复杂,另外设置的方式也有很多,有时候会发生多条规则都和某一个具体控件相关的情况,这样具体哪一条样式表规则最终被应用到控件的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上,也可以单独应用在控件上,所以最终应用到一个具体控件的样式表,是通过叠加合并所有的父控件乃至应用程序的样式表设定来得到的。这种情况下,也有可能发生规则冲突, 例如:
- qApp->setStyleSheet("QPushButton { color: white }");
- myPushButton->setStyleSheet("* { color: blue }");
这种情况下,控件自身的样式表的优先级高于父控件或应用程序的样式表
样式表继承 Inheritance
在标准的CSS样式表中,一个控件的字体和颜色属性如果没有明确设定,那么将自动继承自父控件,而在QT的样式表中,不会自动继承,例如:
qApp->setStyleSheet("QGroupBox { color: red; } ");
这种情况下,对于GroupBox中的添加的子控件,不会自动设置其颜色属性,如果要设置子控件的属性,需要明确设定:
qApp->setStyleSheet("QGroupBox, QGroupBox * { color: red; }");
注意,这里的继承和上面的层叠不一样,层叠指不同样式表设置同一个对象,继承指的则是样式表规则中选择器对控件层级关系的影响
Stylesheet是如何附加在Style上的
当
设置StyleSheet的时候,一个QStyleSheetStyle会被生成并被设为应用程序实际的Style,而当前的Style则被
reparent成QStyleSheetStyle的子对象,当应用程序或控件调用Style绘图的时候,实际调用的是
QStyleSheetStyle对象,在QStyleSheetStyle类内部,会先调用函数按照StyleSheet定义的规则绘制UI,如果没有
相关规则,再调用当前的Style对象的绘图函数绘制UI,所以QStyleSheet作为一个代理Style先对UI进行处理。
Trackback:http://qimo601.iteye.com/blog/1634788
【转】QT样式表 (QStyleSheet)的更多相关文章
- Qt样式表的使用
Qt中可以灵活的使用层叠样式表(CSS),其语法和CSS很相似.因为HTML CSS的灵活性,所以可以很方便的为QT界面设计自己需要的外观.除了子类化Style类,使用QT样式表(QStyleShee ...
- 通过Qt样式表定制程序外观(比较通俗易懂)
1. 何为Qt样式表[喝小酒的网摘]http://blog.hehehehehe.cn/a/10270.htm2. 样式表语法基础3. 方箱模型4. 前景与背景5. 创建可缩放样式6. 控制大小7. ...
- Qt样式表使用注意项
Qt样式表使用注意项 <1>.StyleSheet的使用StyleSheet文件的默认后缀名为qss,可以通过命令行参数-stylesheet filename.qss来设置样式表,也可以 ...
- QT样式表
QT样式表 一.QT样式表简介 1.QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离,使得设计皮肤与界面控件分离的软件成为可能. QT样式表是允许用户定制widgets组件外观的强大机制 ...
- QT 样式表基础知识
1. 何为Qt样式表2. 样式表语法基础3. 方箱模型4. 前景与背景5. 创建可缩放样式6. 控制大小7. 处理伪状态8. 使用子部件定义微观样式 8.1. 相对定位 8.2. 绝对定位 摘要 ...
- qt 样式表基本用法
Qt样式表 QT样式表参考CSS层叠样式表设计,不同之处在于QT样式表应用于Widget世界. 可以使用QApplication::setStyleSheet()函数设置到整个应用程序上,也可以使用Q ...
- QT +样式表
学习样式表的目的:可以设计出好看的控件.(比如可以给一些按钮设计成好看的图片) QT 样式表的思想很大程度上是来自于HTML的层叠式样式表(CSS),通过调用QWidget->setStyleS ...
- Qt样式表之三:实现按钮三态效果的三种方法
按钮的三态,指的是普通态.鼠标的悬停态.按下态.Qt中如果使用的是默认按钮,三态的效果是有的,鼠标放上去会变色,点击的时候有凹陷的效果. 但是如果自定义按钮实现三态效果有三种方法,一种是设置背景图,主 ...
- Qt样式表之二:QSS语法及常用样式
一.简述 Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同.如果你熟悉CSS,可以快速浏览以下内容.不熟悉的话可以先去W3School - CSS或者本人的CSS博客随笔简单了解一下. 在 ...
随机推荐
- STM8S---IO复用配置(STVP方式)
1 说明 STM8S的IO复用用程序代码配置起来比較麻烦.通常是操作flash来操作option byte字节.配置寄存器更加麻烦,能够使用STM 标准外设驱动库来设置. 本文使用一种界面配置的方式来 ...
- [Android学习笔记]自定义控件的使用
自定义控件时,最好抽象得彻底,并且编写需严谨,因为可能程序中多处都会引用到它,或者提供给团队中的其他人使用. 其一般步骤为: 1.创建控件的类文件,定义其功能逻辑.一般继承自现有控件或者View2.在 ...
- The mmap module
The mmap module The mmap module (New in 2.0) This module provides an interface to the operating syst ...
- JavaScript 中的事件对象(读书笔记思维导图)
在触发 DOM 上的某个事件时,会产生一个事件对象 event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对象中,会包含 ...
- hdu1535(最短路)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1535 题意:给你一个源点,让你从这里派发n个学生去其余的n-1个站点去邀请人们去CSS,然后再返回CS ...
- UFLDL教程笔记及练习答案二(预处理:主成分分析和白化)
首先将本节主要内容记录下来.然后给出课后习题的答案. 笔记: :首先我想推导用SVD求解PCA的合理性. PCA原理:如果样本数据X∈Rm×n.当中m是样本数量,n是样本的维数.PCA降维的目的就是为 ...
- 已知直线上的两点 A(x1, y1), B(x2, y2) 和另外一点 C(x0, y0),求C点到直线的距离。
数学知识太差,一点点积累,高手勿喷. 1. 先求出AB向量 a = ( x2-x1, y2-y1 ) 2. 求AB向量的单位方向向量 b = √((x2-x1)^2 + (y2-y1)^2)) a1 ...
- dell N5010
Inspiron N5010Microsoft Windows 10 企业版 (64位) (英特尔)Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz(24 ...
- C#-循环滚动字幕,timer,从左至右,从右至左,暂停---ShinePans
Lable的Left属性是能够更改的,可是 Right属性不能够更改,所以我们能够利用 这个特点做自加 自减运算 using System; using System.Collections.Gene ...
- 为什么推荐std::string而不是char*
例如如下: map<const char*, const char*> map_test; map_test["a"] = "a"; map_tes ...