Qt——QSS

目录

基本语法

样式影响范围

样式和代码分离

第一种方式

第二种方式

QSS选择器

一般选择器

子控件选择器

伪类选择器

[QSS盒子模型样式设置(Box Model)](#QSS盒子模型样式设置(Box Model))

有哪些样式可以设置

一些控件的样式设置

给按钮设置样式

给复选框设置样式

给输入框设置样式

关于样式中的线性渐变色

给列表框设置样式

给菜单栏设置样式

简单设计一个登录界面​


基本语法

基本语法:

选择器 { 属性名:属性值;属性名:属性值;...}

使用控件的setStyleSheet方法就可以把样式设置进去:

cpp 复制代码
this->setStyleSheet("QPushButton{color:red;}QLabel{color:black;}")

样式影响范围

父控件的样式也会应用到子控件上,但不会影响到同级别的其余控件**。如果各种方式设置样式发生冲突就局部优先,例如:如果父控件样式和子控件样式冲突了以子控件为准;如果不冲突就叠加。**

QApplication表示整个客户端,也可以直接给它设置样式,表示全局样式。


样式和代码分离

样式较多的时候,如果还让样式分布在代码的各个地方,就会使得代码(样式)难以维护,因此引入样式和代码分离,这里提供两种方法。

第一种方式

创建一个qss文件并将其引入qrc文件

在qss文件中编辑样式

使用QFile读取qss文件内容,将其设置为全局样式

结果如下:

第二种方式

这种方式利用ui文件进行设置,支持实时预览,步骤如下:

选中项要设置样式的控件,右击选择改变样式表

在这个窗口编写样式

结果如下


QSS选择器

选择器就是指定某个样式应该应用到什么样的目标上**。**

一般选择器

cpp 复制代码
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyleSheet("QPushButton,QLabel,#pushButton{color:blue;} QTextEdit{color:red}");
    MainWindow w;
    w.show();
    return a.exec();
}

子控件选择器

有些控件默认包含子控件,它们没有独立的objectname,如果要单独给他们设置样式就要用到子控件选择器。

在Qt的文档中给我们列出了选择这些子控件的使用的名称,哪些控件包含他们,我们可以进行查看:

使用上面这些名称,我们就可以选择控件中固有的子控件了:

cpp 复制代码
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyleSheet("QComboBox::drop-down{image:url(:/down.png);}");
    MainWindow w;
    w.show();
    return a.exec();
}

伪类选择器

伪类选择器选择的不是控件本身,而是控件所处的状态**,例如:鼠标悬停在控件上,鼠标按下,等等。**

下面是常用状态:

Qt也提供给我们了查询可用状态的文档:

接下来我们来使用一下伪类选择器:

cpp 复制代码
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyleSheet("QPushButton{color:green;}QPushButton:hover{color:red;}QPushButton:pressed{color:blue;}");
    MainWindow w;
    w.show();
    return a.exec();
}

QSS盒子模型样式设置(Box Model)

支持盒子模型的控件可以设置margin,border,padding等属性,而大多数控件都支持它。

盒子模型具体如下:

盒子模型可以设置的属性如下:

复合属性:本来是多个属性,可以通过一个属性来一起设置:

下面是使用示例:

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
    button->setGeometry(0,0,100,100);
    
    button->setStyleSheet("QPushButton{border:5px solid red;margin:20px;padding:20px;}");
}

geometry设置了按钮的大小,设置外边距或者边框宽度的时候占用的都是按钮的大小,也就是说盒子模型的总大小是不变的(因此上面的按钮看起来比100*100要小)。


有哪些样式可以设置

Qt文档中可以查询可设置的样式,以及这些样式能够被什么控件使用:


一些控件的样式设置

给按钮设置样式

给复选框设置样式

给输入框设置样式

关于样式中的线性渐变色

渐变色的设置是通过类似于函数的语法:

qlineargradient(x1:?,y1:?,x2:?,y2:?,stop:0 ?,stop:0 ?)

?所在的位置是我们需要填入的地方

x1,x2,y1,y2的取值只有0/1:

下面我们会使用线性渐变色。

给列表框设置样式

cpp 复制代码
QListWidget::item:hover
{
background-color:qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgb(255, 15, 87),stop:1 rgb(52, 89, 255));
}

QListWidget::item:selected
{
background-color:qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgb(205, 255, 189),stop:1 rgb(235, 255, 144));
}

给菜单栏设置样式

cpp 复制代码
QMenuBar
{
background-color:qlineargradient(x1:0,y1:0,x2:1,y2:0,stop: 0 rgb(0, 0, 0),stop: 1 rgb(255, 6, 6));
spacing:3px;
}
QMenuBar::item
{    
	border-radius: 10px;
	border:1px solid white;
	color:white;
	background-color:transparent; 
	padding:5px 15px;
}
QMenuBar::item::selected
{
	background-color:blue;
}
QMenu::separator
{
	background-color:green;
	height:2px;
	margin:0 10px;
}
QMenu::item
{
	border:1px solid transparent;
    padding:3px 10px;
	
}
QMenu::item:selected
{
	border:1px solid red;
	
}

简单设计一个登录界面

cpp 复制代码
QFrame
{
  border-image:url(:/x.png);
}
QLineEdit
{
	background-color:rgb(152, 233, 255);
	color:red;
	border:1px solid black;
	border-radius:10px;
	padding-left:10px;
font-size:20px;
}
QCheckBox
{
	color:white;
}
QPushButton
{
	border-radius:10px;
	background-color:rgb(170, 170, 127);
	color:black;
}
QPushButton:pressed
{
	background-color:red;
}
相关推荐
Scott9999HH2 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海3 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大7 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜8 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa8 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio