QSS简介
QSS(Qt Style Sheet)样式表是一种用于描述图形用户界面(GUI)样式的语言。它允许开发者为应用程序的控件定义视觉外观,例如颜色、字体、尺寸和布局等。
QSS 样式表的主要目的是提供一种简洁而灵活的方式来美化应用程序的界面,使其具有一致的外观和风格。通过使用 QSS,开发者可以分离界面的样式和功能代码,从而更容易维护和定制界面的外观。
QSS 样式表通常以.qss
文件的形式保存,其中包含了一系列的样式规则。这些规则使用选择器来指定要应用样式的控件,以及对应的样式属性和值。例如,可以使用类似于 CSS 的选择器来定义按钮的颜色、文本框的字体大小或窗口的背景颜色。
QSS 还支持继承和层次结构,这使得样式可以在控件之间传递和复用。例如,可以定义一个基本的样式,然后在特定的控件上覆盖或修改这些样式,以实现个性化的效果。
除了基本的样式属性,QSS 还提供了一些高级特性,如动画效果、状态变化和伪类等。这使得开发者能够创建更具交互性和动态的界面,例如在鼠标悬停时改变按钮的颜色,或在控件获得焦点时显示边框。
使用 QSS 样式表有许多好处。它可以提高应用程序的用户体验,使界面看起来更加专业和吸引人。此外,样式表的可维护性使得在不同平台上保持一致的外观变得更加容易,同时也减少了与界面外观相关的代码复杂性。
1.1 盒子模型
CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容。
盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。
下面的图片说明了盒子模型(Box Model):
不同部分的说明:
Margin(外边距) - 清除边框外的区域,外边距是透明的。 Border(边框) - 围绕在内边距和内容外的边框。 Padding(内边距) - 清除内容周围的区域,内边距是透明的。 Content(内容) - 盒子的内容,显示文本和图像。 为了正确设置元素在所有浏览器中的宽度和高度,你需要知道的盒模型是如何工作的。
2. QSS加载方式
方式一:在代码中加载
myDialog->setStyleSheet("QLineEdit { background-color: yellow }");
nameEdit->setStyleSheet("background-color: yellow");
方式二:读文件的方式加载
QFile file("://qss/styles.css");if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){qWarning("styles.css open falied");}this->setStyleSheet(file.readAll());
3.QSS选择器类型
3.1 通配选择器
*
匹配所有的控件
3.2 类型选择器
QPushButton
匹配所有QPushButton和其子类的实例
QPushButton {background: gray;}
3.3 属性选择器
QPushButton[flat="false"]
匹配所有flat属性是false的QPushButton实例,注意该属性可以是自定义的属性,不一定非要是类本身具有的属性
QPushButton[STYLE_KEY='dangerous'] { background: magenta; }
/*openButton->setProperty("STYLE_KEY", "dangerous");*/
3.4 类选择器
.QPushButton
匹配所有QPushButton的实例,但是并不匹配其子类。这是与CSS中的类选择器不一样的地方,注意前面有一个点号
.RedButton { background: magenta; }/*
openButton->setProperty("class", "RedButton");
closeButton->setProperty("class", "RedButton");
*/
3.5 ID选择器
#myButton
匹配所有id为myButton的控件实例,这里的id实际上就是objectName指定的值
#openButton, #closeButton { background: magenta; }
3.6 后代选择器
QDialog QPushButton
所有QDialog容器中包含的QPushButton,不管是直接的还是间接的
QDialog {background: gray;}
/* 设置 QDialog中的 QPushButton 的 QSS */
QDialog QPushButton
{border: 2px solid magenta;border-radius: 10px;background: white;padding: 2px 15px;
}
3.7 子选择器
QFrame> QPushButton
所有QFrame容器下面的QPushButton,其中要求QPushButton的直接父容器是QFrame,注意和后代选择器的区别
QFrame {background: gray;}
QFrame > QPushButton
{border: 2px solid magenta;border-radius: 10px;background: white;padding: 2px 15px;
}
3.8 伪类选择器
选择器:状态 作为选择器,支持 ! 操作符,表示 非。
QPushButton:hover { color: white }
QCheckBox:checked { color: white }
QCheckBox:!checked { color: red }
所有的这些选择器可以联合使用,并且支持一次设置多个选择器类型,用逗号隔开,这点与CSS一样,例如:
#frameCut,#frameInterrupt,#frameJoin 表示所有这些id使用一个规则。
#mytable QPushButton 表示选择所有id为mytable的容器下面
4. QSS常用属性
4.1 字体
大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD样式 {font-style: oblique;}(偏斜体) italic;(斜体) normal;(正常)行高 {line-height: normal;}(正常) 单位:PX、PD、EM粗细 {font-weight: bold;}(粗体) lighter;(细体) normal;(正常)变体 {font-variant: small-caps;}(小型大写字母) normal;(正常)大小写 {text-transform: capitalize;}(首字母大写) uppercase;(大写) lowercase;(小写) none;(无)修饰 {text-decoration: underline;}(下划线) overline;(上划线) line-through;(删除线) blink;(闪烁)
4.2 颜色
17种标准色:aqua, black, blue, fuchsia, gray, green, lime, maroon, navy,olive, orange, purple, red, silver, teal, white, yellow
colo:rgb(255,255,255); color: #F5F5F5; /* 前景(文本)颜色 */ color: qlineargradient(); /* 前景(文本)颜色:线性渐变*/ color: qradialgradient(); /* 前景(文本)颜色:辐射渐变*/ color: qconicalgradient(); /* 前景(文本)颜色:梯形渐变*/
4.3 内边距
padding: 14px 18px 20px 18px; /*内边距 顺序上右下左 */padding-left: 5px; /* 文字左边距 */ padding-right: 10px; /* 文字右边距 */ padding-top: 3px; /* 文字顶边距 */ padding-bottom: 3px; /* 文字底边距 */
4.4 外边距
margin: 14px 18px 20px 18px; /*外边距 顺序上右下左 */margin-top: 14px;margin-right: 18px;margin-bottom: 20px;margin-left: 18px;
4.5 背景
background-color: #202122; /* 背景颜色 */ background-color: qlineargradient(); /* 背景颜色:线性渐变*/ background-color: qradialgradient(); /* 背景颜色:辐射渐变*/ background-color: qconicalgradient(); /* 背景颜色:梯形渐变*/ background-image:url(boder.png); /* 背景图片 */ background-position: ; /* 背景图片对齐方式 */ background-repeat: ; /* 背景图片平铺方式 */
4.6 边框
border-style: solid;/*边框类型*/
/*===============================*/
dotted - 定义点线边框
dashed - 定义虚线边框
solid - 定义实线边框
double - 定义双边框
groove - 定义 3D 坡口边框。效果取决于 border-color 值
ridge - 定义 3D 脊线边框。效果取决于 border-color 值
inset - 定义 3D inset 边框。效果取决于 border-color 值
outset - 定义 3D outset 边框。效果取决于 border-color 值
none - 定义无边框
hidden - 定义隐藏边框
/*===============================*/border-width: 2px; /*边框宽度*/border-color: #FDBC03; /*边框颜色*/border: 1px solid #FDBC03; /* 边框:宽度 类型 颜色*/ border-image:url(boder.png) 4 8 12 16; /* 边界图 切线 */ border-radius: 4px; /* 角弧度 */ border-top-left-radius: 4px; /* 角弧度:左上角*/ border-top-right-radius: 4px; /* 角弧度:右上角*/ border-bottom-left-radius: 4px; /* 角弧度:左下角*/ border-bottom-right-radius: 4px; /* 角弧度:右下角*/
4.7 宽高
width:12px; /*设置宽度*/height:40px; /*设置高度*/min-width:65px; /*最小宽度*/min-height:12px; /*最小高度*/max-width:12px; /*最大宽度*/max-height:12px; /*最大高度*/
5. QSS伪状态与子控件
5.1 伪状态列表
:checked /*button部件被选中*/
:unchecked /*button部件未被选中*/
:disabled /*部件被禁用*/
:enabled /*部件被启用*/
:focus /*部件获得焦点*/
:hover /*鼠标位于部件上*/
:indeterminate /*checkbox或radiobutton被部分选中*/
:off /*部件可以切换,且处于off状态*/
:on /*部件可以切换,且处于on状态*/
:pressed /*部件被鼠标按下*/
5.2 子部件列表
::down-arrow /*combo box或spin box的下拉箭头*/
::drop-down /*combo box的下拉箭头*/ ::indicator /*checkbox、radio button或可选择group box的指示器*/
::item /*menu、menu bar或status bar的子项目*/
::menu-indicator /*push button的菜单指示器*/
::title /*group box的标题*/ ::down-button /*spin box的向下按钮*/
::up-arrow /*spin box的向上箭头*/
::up-button /*spin box的向上按钮*/
6 以下是一个简单的 QSS 样式表示例:
QPushButton {font: bold 16px Arial;background-color: lightblue;color: black;
}QLineEdit {font: 12px Arial;border: 1px solid gray;padding: 2px;
}
在上述示例中,我们定义了两个控件的样式:QPushButton
和 QLineEdit
。
对于 QPushButton
,我们设置了字体为加粗的 16 像素Arial 字体,背景颜色为浅蓝色,文本颜色为黑色。
对于 QLineEdit
,我们设置了字体为 12 像素的 Arial 字体,边框为 1 像素的实线灰色,内边距为 2 像素。
要应用这些样式,你可以将样式表文件保存为 .qss
格式(例如 style.qss
),然后在你的 Qt 应用程序中使用 QApplication::setStyleSheet()
方法加载样式表:
#include <QApplication>
#include <QPushButton>
#include <QLineEdit>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 加载样式表app.setStyleSheet("style.qss");// 创建控件并显示QPushButton button("Click Me");button.show();QLineEdit edit;edit.show();return app.exec();
}
码字不易,欢迎点赞支持!