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;
}
相关推荐
死磕音视频7 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲10 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
用户83344239661410 小时前
从批量操作到任务中心,再到现场工作台:DeviceForge v2.10—v2.12 完整演进
qt
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
宛 禾11 小时前
Qt 控件入门:QLabel 从拖拽到对象树,一篇讲透
c++·qt·学习
程序喵大人12 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)12 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的12 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质13 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
释厄62313 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin