Qt 外观之Qt样式表(QSS)

如果想对Qt的界面添加一些特别的外观,进行美化,可以使用QSS。

在Qt中,Qt 样式表(Qt Style Sheets,简称QSS)是基于CSS语法的机制,用于自定义控件的外观(颜色、字体、边框、布局等),支持大多数Qt控件(如QPushButtonQLineEditQWidget等)。

一般有三种方式设置Qt的样式表。

一、设置样式表的3种常用方式

1. 代码中通过setStyleSheet()设置

在C++或Python(PyQt/PySide)代码中,通过控件的setStyleSheet()方法,可以设置样式表,适用于动态修改样式,样式需要适应程序而变化的场景。

样式表作为整个字符串传参,因此字符串换行需要注意代码规范。

可以使用续行符 \,避免冗长的字符串写在一行中。但是续行符\之后要紧跟换行,不能添加注释。

下述方法可以在每行添加注释,在源代码中:

C++11之前的字符串如果换行书写,需要每一行使用双引号""包裹。

C++11及之后,则可以使用原生字符串R"()",无需每行加引号。

如果是python代码,使用三引号可以直接换行''' ''''

示例(C++)

cpp 复制代码
#include <QPushButton>
#include <QWidget>

// 为单个按钮设置样式
QPushButton *btn = new QPushButton("点击我", this);
btn->setStyleSheet(
    "QPushButton {"  // 正常状态
        "color: white;"  // 文字颜色
        "background-color: #2E8B57;"  // 背景色(海绿色)
        "border-radius: 5px;"  // 圆角
        "padding: 5px 10px;"  // 内边距
    "}"
    "QPushButton:hover {"  // 鼠标悬停状态
        "background-color: #3CB371;"
    "}"
    "QPushButton:pressed {"  // 鼠标按下状态
        "background-color: #228B22;"
    "}"
);

// 为整个窗口(及子控件)设置样式
this->setStyleSheet(
    "QWidget {"
        "background-color: #F5F5F5;"  // 窗口背景色
    "}"
    "QLineEdit {"
        "border: 1px solid #CCCCCC;"
        "border-radius: 3px;"
        "padding: 3px;"
    "}"
);

换行写法的示例:

c++ 复制代码
//续行符,无版本限制
btn->setStyleSheet(
    "QPushButton {\
        color: white;\
        background-color: blue;\
    }"  // 最后一行字符串
);

// C++11之前:多行字符串用引号+连接符
btn->setStyleSheet(
    "QPushButton {"  // 第一行字符串
    "    color: white;"  // 第二行字符串(用引号)
    "    background-color: blue;"  // 第三行字符串(用引号)
    "}"  // 最后一行字符串
);
// 等价于:"QPushButton {    color: white;    background-color: blue;}"


//C++11及以后使用原生字符串
btn->setStyleSheet(R"(
    QPushButton {
        color: white;
        background-color: blue;
    }
)");  // R"(...)" 包裹的内容支持直接换行,无需每行引号

示例(PyQt)

python 复制代码
from PyQt5.QtWidgets import QPushButton, QWidget

btn = QPushButton("点击我", self)
btn.setStyleSheet("""
    QPushButton {
        color: white;
        background-color: #2E8B57;
        border-radius: 5px;
        padding: 5px 10px;
    }
    QPushButton:hover {
        background-color: #3CB371;
    }
""")

2. 在Qt Designer的属性中设置

在Qt Designer(可视化界面设计工具)中,可直接为控件设置样式表,适用于初始化,后续样式一成不变的场景。

步骤如下:

  1. 选中目标控件(如按钮、窗口);

  2. 在右侧「属性编辑器」中找到styleSheet属性(或者在过滤器中搜索);

  3. 点击属性值右侧的「...」按钮,打开「样式表编辑器」;

  4. 输入样式表内容(支持语法高亮和预览),点击「确定」即可。

「样式表编辑器」的内容就是样式表的内容,和上述的代码传参的字符串是一样的,但是无需考虑换行的语法限制。

刚打开,一般是空的,需要先写上选择器紧跟着{},然后在{}中添加属性与值形成一对声明,声明之间使用;分隔。

3. 加载外部样式表文件 .css

将样式表内容写入.css文件(如style.css),通过代码读取并应用,这种方式便于样式管理和复用。

示例(C++)

cpp 复制代码
#include <QFile>
#include <QTextStream>

// 读取外部样式表文件
QFile file(":/style.css");  // 假设文件在资源文件中
if (file.open(QFile::ReadOnly | QFile::Text)) {
    QTextStream in(&file);
    QString styleSheet = in.readAll();
    this->setStyleSheet(styleSheet);  // 应用到窗口
    file.close();
}

style.css内容示例

css 复制代码
QPushButton {
    color: white;
    background-color: #4169E1;
    border: none;
    border-radius: 4px;
}
QPushButton:pressed {
    background-color: #1E90FF;
}

二、样式表语法基础

Qt样式表语法与CSS类似,核心由「选择器」和「声明」组成:
选择器 { 声明1; 声明2; ... }

1. 选择器(指定作用的控件)

选择器类型 示例 说明
类型选择器 QPushButton 匹配所有QPushButton及子类控件
类选择器 .QPushButton 仅匹配QPushButton(不包括子类)
ID选择器 #myBtn 匹配objectNamemyBtn的控件
属性选择器 QLineEdit[readOnly="true"] 匹配readOnly属性为true的输入框
后代选择器 QWidget QPushButton 匹配QWidget的子控件中的QPushButton
子选择器 QWidget > QPushButton 匹配QWidget的直接子控件QPushButton

2. 声明(定义样式属性)

声明由「属性名: 值」组成,常见属性如下:

  • 颜色:color(文字色)、background-color(背景色);
  • 字体:font-family(字体)、font-size(字号)、font-weight: bold(粗体);
  • 边框:border: 1px solid gray(边框样式)、border-radius: 5px(圆角);
  • 内边距/外边距:padding: 5px(内边距)、margin: 3px(外边距);
  • 尺寸:min-width: 100px(最小宽度)、height: 30px(高度)。

3. 伪状态(控件的状态样式)

通过:伪状态定义控件在特定状态下的样式,常见伪状态:

  • :hover:鼠标悬停时;
  • :pressed:鼠标按下时;
  • :checked:选中状态(如复选框);
  • :disabled:禁用状态;
  • :focus:获取焦点时(如输入框)。

示例

css 复制代码
QCheckBox:checked {
    color: red;  // 选中时文字为红色
}
QLineEdit:focus {
    border: 2px solid blue;  // 获焦时边框变蓝
}

4. 子控件(复杂控件的内部元素)

部分控件包含子控件(如下拉框的箭头、滑块的手柄),通过::子控件名设置样式:

  • QComboBox::drop-down:下拉框的箭头按钮;
  • QSlider::handle:滑块的拖动手柄;
  • QScrollBar::handle:滚动条的拖动块。

示例

css 复制代码
QComboBox::drop-down {
    width: 20px;  // 下拉箭头宽度
    border-left: 1px solid gray;
}
QComboBox::down-arrow {
    image: url(:/arrow.png);  // 自定义箭头图标
}

三、注意事项

  1. 优先级 :更具体的选择器优先级更高(如#myBtn > QPushButton),后设置的样式会覆盖先设置的同名属性。
  2. 继承性:父控件的样式表会影响子控件(除非子控件单独设置样式)。
  3. 局限性 :部分控件(如QTableView)的样式可能需要结合QItemDelegate自定义,样式表无法覆盖所有细节。
  4. 调试 :若样式不生效,可检查选择器是否正确、属性是否支持(参考Qt官方文档),或使用QApplication::setStyleSheet()全局应用样式表排查冲突。

四、参考


持续更新中。。。。。。。。。。。。。。。

相关推荐
LNN202215 小时前
Qt creator +Valgrind检测内存泄漏(linux)
linux·开发语言·qt
奔跑吧 android18 小时前
【Docker】【03.使用docker搭建ubuntu20.04 Qt5.12 开发环境】
qt·docker·ubuntu20.04·qt5.12
扶尔魔ocy1 天前
【QT常用技术讲解】可拖拽文件的Widget--QListWidget
开发语言·qt
枫叶丹41 天前
【Qt开发】布局管理器(一)-> QVBoxLayout垂直布局
开发语言·c++·qt
Larry_Yanan1 天前
QML学习笔记(四十七)QML与C++交互:上下文对象
c++·笔记·qt·学习·ui
上去我就QWER2 天前
深入理解 Qt 信号槽机制
qt
钱彬 (Qian Bin)2 天前
项目实践6—全球证件智能识别系统(Qt客户端开发+FastAPI后端人工智能服务开发)
人工智能·qt·fastapi·证件识别
Lhan.zzZ2 天前
详解 QGridLayout:Qt的网格布局管理器
开发语言·qt
长沙红胖子Qt2 天前
VTK开发笔记(八):示例Cone5,交互器的实现方式,在Qt窗口中详解复现对应的Demo
qt·vtk·交互·交互器