天天看点

Qt—样式表(setStyleSheet())

内容借鉴于《精通Qt4编程》和《Qt Creator快速入门》以及网上博客等一些资料,刚好自己需要用到这个知识,把Qt的样式表资料整理总结一下。

Qt样式表描述窗口部件外观的机制,类似于HTML的层叠样式表(Cascading Style Sheet,CSS)。样式表在Qt的风格之上起作用(如果使用了样式表,QWidget::style()返回的Qstyle为“style sheet”),提供了比Qpalette更为灵活、更强大的机制。

样式表使用文本描述,可以在应用程序级别和窗口部件级别设置样式表。如果在不同的级别都设置了样式表,则Qt继承所有有效的样式,这就是层叠(cascading)。

1、样式规则(选择符 {声明})

样式表包含了一系列的样式规则,一个样式规则由一个选择符(selector)和一个声明(declaration)组成。选择符指定了哪些窗口部件受规则影响;声明指定了这个部件上要设置哪些属性。例:

QPushButton { color:red }

在这个样式规则中,QPushButton是选择符,{ color:red }是声明,而color是属性,red是值。这个规则指定了QPushButton和它的子类应该使用红色作为它们的前景色。Qt样式表中一般不区分大小写,例如color、Color、COLOR表示相同的属性。只有类名,对象名和Qt属性名是区分大小写的。一些选择符可以指定相同的声明,只需要使用逗号隔开,例如:

QPushButton, QLineEdit, QComboBox { color:red }

//前景色和背景色的区别:

背景色:把整个画布都用一种颜色填充,画板的底色

前景色:工具如画笔、画刷使用的颜色就是前景色,画笔或画刷描绘的图片的颜色

一个样式规则的声明部分是一些属性:值对组成的列表,它们包含在大括号中,使用分号隔开。例如:

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

2.选择符类型

Qt支持CSS2中所有的选择符,如下图:

Qt—样式表(setStyleSheet())

3、子控件(Sub-Controls)

对一些复杂的部件修改样式,可能需要访问它们的子控件,例如QComboBox的下拉按钮,还有QSpinBox的向上和向下的箭头等。选择符可以包含子控件来对部件的特定子控件应用规则,例如:

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

这样的规则可以改变所有的QComboBox部件的下拉按钮。

4、伪状态(Pseudo-States)

选择符可以包含伪状态来表示窗口部件的状态。伪状态出现在选择符之后,用冒号隔离,例如:

QPushButton::hover { color:white }

这个规则表明当鼠标悬停在一个QPushButton部件上时才被应用。伪状态可以使用感叹号来表示否定,例如:要当鼠标没有悬停在一个QRadioButton上时才应用规则,那么这个规则可以写为:

QRadioButton:: !hover { color:red }

伪状态还可以多个连用,达到逻辑与效果。例如:当鼠标悬停在一个被选中的QCheckBox部件上时才应用规则,那么这个规则可以写为:

QCheckBox: hover : checked { color:white }

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

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

5、冲突解决

当不同的规则应用到相同的属性时,样式表舅产生了冲突。在这种情况下,特定的规则比通用的规则优先;伪状态比没有伪状态优先;如果级别相同,则最后一个规则优先。冲突解决按照CSS2规则进行。

6、层叠

样式表可以在Qapplication级别设置,也可以在父窗口部件,子窗口部件级别设置。实际应用样式表时,则合并这几个级别的样式。当有冲突时,窗口部件自身的样式优先使用,接下来是父窗口部件,祖先窗口部件,以此类推。

7、盒子模型(The Box Model)

当使用样式表时,每一个部件都看作是拥有4个同心矩形的盒子。这4个矩形分别是内容(content)、填衬(padding)、边框(border)、边距(margin)。边距、边框宽度和填衬等属性的默认值都是0,这样4个矩形恰好重合。如下图:

Qt—样式表(setStyleSheet())

可以使用background-image属性来为部件指定一个背景,默认的background-image只在边框以内的区域进行绘制,这个可以使用background-clip属性来进行更改。可以使用background-repeat和background-origin来控制背景图片的重复方式以及原点。

一个background-image无法随着部件的大小来自动缩放,如果想要背景随着部件的大小变化,那就需要使用border-imgae。如果同时指定了background-image和border-image,那么border-image会绘制在background-image之上。image属性可以用来在border-image之上绘制一个图片。如果使用image指定的图片大小部件的大小不匹配,那么它不会平铺或者拉伸。图片的对齐方式可以使用image-position属性设置。

8、代码例子

设置样式表例子:来源自《Qt Creator快速入门》

/****************主界面背景*******************/
QMainWindow{
        background-image: url(:/image/beijing01.png);/*背景图片*/
}

/****************按钮部件*******************/
QPushButton{
     background-color: rgba(, , , );/*背景色*/
     border-style: outset; /*边框样式*/
     border-width: px;  /*边框宽度为4像素*/
     border-radius: px; /*边框圆角半径*/
     border-color: rgba(, , , );/*边框颜色*/
     font: bold px;/*字体*/
         color:rgba(, , , );/*字体颜色*/
     padding: px; /*填衬*/
}

QPushButton:hover{ /*鼠标悬停在按钮上时*/
        background-color:rgba(,,, );
        border-color: rgba(, , , );
        color:rgba(, , , );
}

QPushButton:pressed { /*按钮被按下时*/
     background-color:rgba(,,, );
         border-color: rgba(, , , );
     border-style: inset;
        color:rgba(, , , );
}
           

9、加载样式表文件

使用资源源文件添加到工程

QFile file(":/qss/my.qss");
    // 只读方式打开该文件
    file.open(QFile::ReadOnly); 
    // 读取文件全部内容,使用tr()函数将其转换为QString类型
    QString styleSheet = tr(file.readAll());
    //QString styleSheet = QLatin1String(file.readAll());   //使用这种方式也可以 
    // 为QApplication设置样式表
    qApp->setStyleSheet(styleSheet); 
    file.close();
           

//先大概整理这么多,有时间在后续整理