zoukankan      html  css  js  c++  java
  • Qt样式表之二:QSS语法及常用样式

    一、简述

    Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同。如果你熟悉CSS,可以快速浏览以下内容。不熟悉的话可以先去W3School - CSS或者本人的CSS博客随笔简单了解一下。

    在讲解样式表语法前,我们先看一个例子:

    /*按钮普通态*/
    QPushButton
    {
        /*字体为微软雅黑*/
        font-family:Microsoft Yahei;
        /*字体大小为20点*/
        font-size:20pt;
        /*字体颜色为白色*/    
        color:white;
        /*背景颜色*/  
        background-color:rgb(14 , 150 , 254);
        /*边框圆角半径为8像素*/ 
        border-radius:8px;
    }
    
    /*按钮停留态*/
    QPushButton:hover
    {
        /*背景颜色*/  
        background-color:rgb(44 , 137 , 255);
    }
    
    /*按钮按下态*/
    QPushButton:pressed
    {
        /*背景颜色*/  
        background-color:rgb(14 , 135 , 228);
        /*左内边距为3像素,让按下时字向右移动3像素*/  
        padding-left:3px;
        /*上内边距为3像素,让按下时字向下移动3像素*/  
        padding-top:3px;
    }
    

    上面例子是实现按钮三态效果的样式表。

    注:程序设置的样式表比ui文件里设置的优先级更高。



    二、样式表语法

    2.1 样式规则

    QSS包含了一个样式规则,一个样式规则由一个选择器和声明组成,选择器指定哪些部件由规则影响,声明指定哪些属性应该在部件上进行设置。例如:

    QPushButton { color: red }
    

    上面的例子中QPushButton是选择器,{ color: red }是声明,该规则指定QPushButton及其子类(例如:MyPushButton)应使用红色作为前景色。

    几个选择器可以指定相同的声明,使用逗号(,)来分隔选择器。例如:

    QPushButton, QLineEdit, QComboBox { color: red }
    

    相当于三个规则序列:

    QPushButton { color: red }
    QLineEdit { color: red }
    QComboBox { color: red }
    

    声明部分的规则是一个属性值对(property: value)列表,包含在花括号中,以分号分隔。例如:

    QPushButton { color: red; background-color: white }
    

    参考助手:Qt Style Sheets ReferenceList of Properties部分。

    注:QSS通常不区分大小写(即:color、Color、COLOR、cOloR指同一属性),唯一例外就是类名(class names)、对象名(object names)、属性名(property names)区分大小写。


    2.2 选择器类型

    下表总结了最有用的选择器,所有示例使用了选择器中最简单的类型,类型选择器QSS支持所有的selectors defined in CSS2。

    选择器 示例 说明
    通用选择器 * 匹配所有部件
    类型选择器 QPushButton 匹配QPushButton及其子类的实例
    属性选择器 QPushButton[flat=”false”] 匹配QPushButton中flat属性为false的实例。
    类选择器 .QPushButton 匹配QPushButton的实例,但不包含子类。相当于*[class~=”QPushButton”]。
    ID选择器 QPushButton#okButton 匹配所有objectName为okButton的QPushButton实例。
    后代选择器 QDialog QPushButton 匹配属于QDialog后代(孩子,孙子等)的QPushButton所有实例。
    子选择器 QDialog > QPushButton 匹配属于QDialog直接子类的QPushButton所有实例。

    2.3 子控件

    对于样式复杂的部件,需要访问子控件,例如:QComboBox的下拉按钮或QSpinBox的上下箭头。选择器可能包含子控件,使得可以限制特有部件子控件的应用规则。例如:

    QComboBox::drop-down { image: url(dropdown.png) }
    

    上述规则指定了QComboBoxe下拉按钮样式,虽然双冒号(::)语法让人想起CSS3伪元素,但Qt子控件从概念上讲有不同的级联语义。

    子控件定位总是相对于另一个参考元素,这个参考元素可能是小部件或其它子控件。例如:QComboBox的::drop-down放置,默认的放置在QComboBox区域的右上角。而::drop-down放置,默认的在::drop-down子控件的中央。

    width和height属性可用于控制子控件的大小,注意:设置一个图片会隐式地设置子控件的大小。相对定位(position : relative):可以改变子控件相对初始位置的偏移量。例如:按下QComboBox下拉按钮时,我们可能更喜欢用内部箭头偏移量来产生一个被按下的效果。要做到这一点,我们可以指定:

    QComboBox::down-arrow {
        image: url(down_arrow.png);
    }
    QComboBox::down-arrow:pressed {
        position: relative;
        top: 1px; left: 1px;
    }
    

    绝对定位(position : absolute):允许子控件改变位置和的大小而不受参考元素限制。

    参考助手:Qt Style Sheets ReferenceList of Sub-Controls部分,及Qt Style Sheets ExamplesCustomizing the QPushButton's Menu Indicator Sub-Control部分。


    2.4 伪选择器

    选择器可以包含伪状态,意味着限制基于部件状态的应用程序规则。伪状态出现在选择器后面,用冒号(:)关联。例如,鼠标划过按钮:

    QPushButton:hover { color: white }
    

    伪状态可以用感叹号(!)运算符表示否定。例如,当鼠标不划过QRadioButton:

    QRadioButton:!hover { color: red }
    

    伪状态可以连接使用,这种情况下,相当于隐含了一个逻辑与。例如,当鼠标滑过选中的QCheckBox:

    QCheckBox:hover:checked { color: white }
    

    否定的伪状态也可以连接使用,例如,当鼠标划过一个非按下时按钮:

    QPushButton:hover:!pressed { color: blue; }
    

    如果需要,也可以使用逗号操作来表示逻辑或:

    QCheckBox:hover, QCheckBox:checked { color: white }
    

    伪状态也可以与子控件组合,例如:

    QComboBox::drop-down:hover { image: url(dropdown_bright.png) }
    

    参见助手:Qt Style Sheets ReferenceList of Pseudo-States部分。


    2.5 解决冲突

    示例一

    当样式中指定相同的属性具有不同的值时,就会出现冲突。例如:

    QPushButton#okButton { color: blue }
    QPushButton { color: red }
    

    要解决这个冲突,必须考虑到的选择器的特殊性。上面的例子,QPushButton#okButton 被认为比 QPushButton 更具体,因为它通常是指单个对象,而不是一类的所有实例。所以 okButton 这个按钮文本颜色会设置为blue,而其它按钮文本仍然设置为red。

    示例二

    同样的,利用伪状态比不指定伪状态那些选择器更具体。因此,下面的样式指定一个QPushButton应该有鼠标悬停文本颜色为白色,否则文本颜色为红色。

    QPushButton:hover { color: white }
    QPushButton { color: red }
    

    示例三

    QPushButton:hover { color: white }
    QPushButton:enabled { color: red }
    

    这里,两个选择器有相同的特殊性,但后一条规则优先,即QPushButton:enabled { color: red }优先级更高,所以按钮默认 enabled 的情况下,无论鼠标是否悬停在按钮上,文本颜色始终为白色。

    QPushButton:enabled { color: red }
    QPushButton:hover { color: white }
    

    想要鼠标是否悬停在按钮上文本颜色为白色,根据后面规则优先级更高的原则,则使颜色为white的规则在后面即可,如上所示。

    或者,可以使文本颜色为白色的规则更加具体

    QPushButton:hover:enabled { color: white }
    QPushButton:enabled { color: red }
    

    示例四

    类似的问题出现在类型选择器一起使用。请看下面的例子:

    QPushButton { color: red }
    QAbstractButton { color: blue }
    

    两个规则应用于 QPushButton 实例(因为 QPushButton 继承自 QAbstractButton)并有color属性的冲突。因为 QPushButton 继承 QAbstractButton,所以 QPushButton 比 QAbstractButton 更具体,本应该按钮文本颜色为红色。然而,对于QSS的计算,所有的类型选择具有相同的特殊性,最后出现的规则优先,所以实际上按钮文本颜色为蓝色。如果需要设置QPushButtons为红色文字,需要重新排序规则。

    总结

    为了确定一个规则的特殊性,QSS遵循CSS2规范,一个选择器的特殊性的计算方法如下:

    • 计算选择器中ID属性的数量(= a)
    • 计算选择器中伪状态类和其它属性的数量(= b)
    • 计算选择器中元素名的数量(= c)
    • 忽略伪元素(即子控件)。

    串联的三个数字a-b-c(在具有大基数的数字系统)给出的特殊性。一些例子如下:

    *                 {}  /* a=0 b=0 c=0 -> specificity =   0 */
    LI                {}  /* a=0 b=0 c=1 -> specificity =   1 */
    UL LI             {}  /* a=0 b=0 c=2 -> specificity =   2 */
    UL OL+LI          {}  /* a=0 b=0 c=3 -> specificity =   3 */
    H1 + *[REL=up]    {}  /* a=0 b=1 c=1 -> specificity =  11 */
    UL OL LI.color    {}  /* a=0 b=1 c=3 -> specificity =  13 */
    LI.color.width    {}  /* a=0 b=2 c=1 -> specificity =  21 */
    #okButton         {}  /* a=1 b=0 c=0 -> specificity = 100 */
    

    2.6 级联效应

    QSS可以在QApplication、父部件、子部件中设置。冲突发生时,不论冲突规则的特殊性,部件自身的样式表总优先于任何继承样式表。考虑下面的例子。首先,我们在QApplication中设置样式表:

    qApp->setStyleSheet("QPushButton { color: white }");
    

    然后,我们设置QPushButton的样式表:

    myPushButton->setStyleSheet("color: blue");
    

    QPushButton样式表强制QPushButton(以及任何子部件)显示蓝色文字,尽管应用程序范围内的样式表提供的规则更具体。


    2.7 继承性

    在经典的CSS中,当字体和颜色没有明确设置时,它就会自动从父继承。当使用QSS时,部件不会自动从父继承字体和颜色。例如,一个QGroupBox中包含QPushButton:

    qApp->setStyleSheet("QGroupBox { color: red; } ");
    

    QPushButton不会继承其父QGroupBox的颜色,而是显示系统的颜色。



    三、CSS常用样式

    3.1 CSS文字属性

    CSS文字属性及示例 说明
    color:#999999; 文字颜色
    font-family:Microsoft Yahei,sans-serif; 字体家族
    font-size:16pt; 字体大小
    font-style:itelic;(normal、oblique) 字体样式
    letter-spacing:1pt; 字间距离
    line-height:200%; 设置行高
    font-weight:bold;(lighter、normal、数值900) 字体粗细
    text-decoration:underline;(line-through、overline、none) 字体修饰
    text-align:left;(right、center、justify) 文字左对齐
    vertical-align:top;(bottom、middle、text-top、text-bottom) 垂直对齐方式
    text-transform:uppercase;(lowercase、capitalize) 英文大写
    font-variant: small-caps;(normal) 小型大写字母

    3.2 CSS背景样式:

    CSS背景样式及示例 说明
    background:black; 背景颜色为黑色
    background-color:#F5E2EC; 背景颜色
    background-image:url(/image/bg.gif); 背景图片
    background:transparent; 透视背景
    background-repeat : repeat; 重复排列-网页默认
    background-position : center; 指定背景位置-居中对齐

    3.3 CSS边框空白

    CSS边框空白及示例 说明
    padding:5px 10px 5px 10px; 所有边框留空白
    padding-top:10px; 上边框留空白
    padding-right:10px; 右边框留空白
    padding-bottom:10px; 下边框留空白
    padding-left:10px; 左边框留空白

    3.4 CSS框线

    CSS框线建议书写方式 说明
    border:1px solid red; 所有边框线
    border-top:1px solid #6699cc; 上框线
    border-bottom:1px solid #6699cc; 下框线
    border-left:1px solid #6699cc; 左框线
    border-right:1px solid #6699cc; 右框线
    border-radius:8px; 边框圆角半径

    以上是建议书写方式,但也可以使用常规书写方式,如下表所示:

    CSS框线常规书写方式 说明
    border-top-color:#369; 设置上框线颜色
    border-top-1px; 设置上框线宽度
    border-top-style:solid 设置上框线样式

    其他框线样式如下:

    • solid - 实线
    • dotted - 虚线
    • double - 双线
    • inset - 凹框
    • outset - 凸框
    • groove - 立体内凸框
    • ridge - 立体浮雕框

    3.5 CSS边界样式

    CSS边界样式及示例 说明
    margin-top:10px; 上边界值
    margin-right:10px; 右边界值
    margin-bottom:10px; 下边界值
    margin-left:10px; 左边界值

    注:px:相对长度单位,像素(Pixel)。pt:绝对长度单位,点(Point)。



    参考:

    Qt css样式大全(整理版)


  • 相关阅读:
    Java 动态代理机制分析及扩展
    记:从百度空间搬家到博客园写博客要写的舒服
    字符串与byte[]之间的转换
    关于中文的几个编码GB2312、GBK、GB18030、GB13000
    深入biztalk中各种端口绑定方式(七) 直接绑定之Partner Orchestration
    X.509 数字证书结构和实例
    深入biztalk中各种端口绑定方式(六) 直接绑定之Self Correlating
    在代码中使用biztalk类库建立Message和Part
    Byte[]和BASE64之间的转换
    深入biztalk中各种端口绑定方式(五) 直接绑定之MessageBox
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11039769.html
Copyright © 2011-2022 走看看