Skip to content

QSS - 美化 Qt 窗口

QSS 全称 QT Style Sheet, 是 QT 中用来定义样式的一种语言。

QSS 的语法几乎与 CSS 一致。

QSS 官方文档地址为 https://doc.qt.io/qt-6/stylesheet-reference.html

核心概念

QSS 主要包含三部分:

  • 选择器:用于选择要应用样式的 Qt 小部件
  • 属性:属性用于定义小部件的外观,如颜色、边框、字体
  • 伪类:根据小部件的状态应用特定样式,如悬停、按下、禁用等状态

写法上还有一些注意点:

  • 继承与层叠:样式可以被子小部件继承,多重样式可叠加应用
  • 样式优先级:样式应用顺序和特异性决定最终显示效果

标准写法为:

css
选择器 { /* 选择器表示这个样式针对什么对象生效 */
    属性类型: 属性值;  
}

如:

css

/* 案例 */
QPushButton {  /* 针对按钮 */
    background-color: #4CAF50; /* 按钮背景颜色为绿色 */
    color: white;              /* 按钮文字颜色为白色 */
    border-radius: 8px;         /* 圆角半径为8像素 */
    padding: 8px 16px;          /* 内边距,上下8像素,左右16像素 */
    font-size: 14px;            /* 字体大小为14像素 */
}

不同部件还可以设置不同的样式,如给两个不同的按钮设置样式:

css
QPushButton#button1 {
    background-color: #4CAF50;
}
QPushButton#button2 {
    background-color: #FF0000;
}

这两个按钮的 id 分别为 button1 和 button2,可通过以下代码设置:

python
button1.setObjectName("button1")
button2.setObjectName("button2")

每个按钮也支持通过伪类设置不同状态下的样式:

css
/* 当鼠标悬停在按钮上时,改变按钮的背景颜色 */
QPushButton:hover {}

/* 当按钮被按下时,改变按钮的背景颜色 */
QPushButton:pressed {}

/* 当输入框获得焦点时,改变边框颜色 */
QLineEdit:focus {}

总结一下:

css
// ID 选择器
submit_button = QPushButton("Submit")
submit_button.setObjectName("submitButton")  # 设置 objectName 以用于 ID 选择器


// 元素选择器 
line_edit = QLineEdit()
QLineEdit {
    border: 2px solid gray;
}


// 属性选择器
submit_button = QPushButton("Submit") submit_button.setProperty("customStyle", "green")
QPushButton[customStyle="green"] {
    //......
}

// 最常见的类型选择器
QCheckBox {
    font-size: 14px;
}


// 伪类选择器 :
QLabel:hover {
    //........
}

// 组合选择器
QPushButton, QLabel { 
    font-size: 14px; 
}

使用

方式一:直接在代码里面注入 QSS 语法。

python
// 在代码里面写 Style 
self.setWindowTitle("QSS Example")
self.setGeometry(100, 100, 400, 300)

button = QPushButton("Click Me", self)
button.setGeometry(100, 100, 200, 50)

        # 设置 QSS 样式
self.setStyleSheet("""
    QMainWindow {
        background-color: #f0f0f0;
    }
    QPushButton {
        background-color: lightblue;
        color: white;
        border-radius: 10px;
        padding: 10px;
    }
    QPushButton:hover {
        background-color: darkblue;
    }
""")


// 还可以直接给组件设置 Style
button.setStyleSheet("""
    QPushButton {
        background-color: lightgreen;
    }
""")

方式二:引入 QSS 文件。

python
stylesheet_path = os.path.join(os.path.dirname(__file__), 'layout.qss')
self.load_stylesheet(stylesheet_path)

def load_stylesheet(self, filename):
    with open(filename, "r", encoding="utf-8") as file:
        self.setStyleSheet(file.read())

layout.qss 就是我们要创建的 QSS 文件,PyCharm 支持自动补全,需要下载插件 QSSEditor 。

除我们自己手写 QSS,Github 上开源了许多优秀的主题样式,如:

QDarkStyle 暗色主题库

shell
pip install qdarkstyle
python
import qdarkstyle

// 也可以加载不同的样式 ,具体可以看官网
app = QApplication(sys.argv)
dark_stylesheet = qdarkstyle.load_stylesheet_pyqt6()
app.setStyleSheet(dark_stylesheet)

常用样式

一、通用属性

通用属性适用于大多数控件,控制颜色、大小、布局、边距等。之前有提到一些,下面是完整的通用属性列表:

  1. color:文字颜色
    • 例:color: #000000;
  2. background-color:背景颜色
    • 例:background-color: #FFFFFF;
  3. border:边框属性
    • 语法:border: <宽度> <样式> <颜色>;
    • 例:border: 1px solid #000;
  4. border-radius:圆角边框
    • 例:border-radius: 5px;
  5. padding:内部边距
    • 例:padding: 10px;
  6. margin:外部边距
    • 例:margin: 5px;
  7. font:字体
    • 例:font: bold 14px Arial;
  8. font-family:字体系列
    • 例:font-family: "Times New Roman";
  9. font-size:字体大小
    • 例:font-size: 12px;
  10. font-style:字体样式
    • 例:font-style: italic;
  11. font-weight:字体粗细
    • 例:font-weight: bold;font-weight: 600;
  12. text-align:文本对齐方式
    • 例:text-align: center;,可选值:left, right, center, justify
  13. min-width / min-height:最小宽度/高度
    • 例:min-width: 100px;
  14. max-width / max-height:最大宽度/高度
    • 例:max-width: 300px;
  15. opacity:透明度
    • 例:opacity: 0.7; (值范围为 0 到 1)
  16. qproperty-alignment:控件对齐方式
    • 例:qproperty-alignment: AlignCenter;
  17. qproperty-text:用于设置文本
    • 例:qproperty-text: "Hello World!";
  18. image:设置背景图片
    • 例:background-image: url("path/to/image.jpg");

二、常用控件属性

下面列举一些常用控件的特有属性,通用属性将不再重复列出。

1. QMainWindow(主窗体)

  • background-color:背景颜色
    • 例:background-color: #F0F0F0;
  • border-image:背景图像(拉伸/平铺方式设置窗体背景)
    • 例:border-image: url('background.png') 0 0 0 0 stretch stretch;
  • padding:设置内部边距

2. QPushButton(按钮)

  • hover:鼠标悬停样式
    • 例:QPushButton:hover { background-color: #0078D7; }
  • pressed:按钮按下时的样式
    • 例:QPushButton:pressed { background-color: #005BB5; }
  • border-image:按钮背景图片
    • 例:border-image: url('button.png') 0 0 0 0 stretch stretch;

3. QLineEdit(单行文本输入框)

  • selection-background-color:文本选中时的背景颜色
    • 例:selection-background-color: #D08770;
  • selection-color:文本选中时的文字颜色
    • 例:selection-color: #FFFFFF;
  • placeholder-text:占位符文本颜色
    • 例:QLineEdit { qproperty-placeholderTextColor: #888888; }

4. QSpinBox(数值选择框)

  • up-button / down-button:上下调节按钮样式
    • 例:QSpinBox::up-button { width: 20px; height: 20px; background-color: #A3BE8C; }
  • up-arrow / down-arrow:上下调节按钮图标样式
    • 例:QSpinBox::up-arrow { image: url('up-arrow.png'); }
  • buttonSymbols:显示增减按钮
    • 例:QSpinBox { qproperty-buttonSymbols: UpDownArrows; }

5. QLabel(文本标签)

  • qproperty-alignment:文本对齐方式
    • 例:qproperty-alignment: AlignCenter;
  • qproperty-wordWrap:自动换行
    • 例:qproperty-wordWrap: true;

6. QProgressBar(进度条)

  • chunk:进度条的填充部分样式
    • 例:QProgressBar::chunk { background-color: #4CAF50; }
  • text-align:进度条文本对齐方式
    • 例:text-align: center;

7. QScrollBar(滚动条)

  • handle:滚动条的滑块样式
    • 例:QScrollBar::handle { background-color: #4C566A; border-radius: 4px; }
  • sub-line / add-line:滚动条两端的按钮样式
    • 例:QScrollBar::sub-line { background-color: #D08770; }

8. QSlider(滑动条)

  • groove:滑动条槽样式
    • 例:QSlider::groove:horizontal { height: 8px; background: #D8DEE9; }
  • handle:滑动条的滑块样式
    • 例:QSlider::handle:horizontal { width: 20px; background: #5E81AC; }

9. QComboBox(下拉框)

  • drop-down:下拉箭头样式
    • 例:QComboBox::drop-down { background-color: #A3BE8C; }
  • down-arrow:下拉框的箭头图标
    • 例:QComboBox::down-arrow { image: url('down-arrow.png'); }
  • item:下拉框内的选项样式
    • 例:QComboBox::item { background-color: #ECEFF4; }

10. QMenu(菜单)

  • separator:菜单分隔线样式
    • 例:QMenu::separator { height: 1px; background-color: #4C566A; }
  • item:菜单项样式
    • 例:QMenu::item { padding: 8px 24px; background-color: #3B4252; }
  • item:选中菜单项的样式
    • 例:QMenu::item:selected { background-color: #5E81AC; }

三、布局相关属性

布局是Qt中的重要部分,用于控件的排列和对齐。

1. QVBoxLayout / QHBoxLayout

  • spacing:控件之间的间距
    • 例:QVBoxLayout { spacing: 10px; }
  • margin:布局外边距
    • 例:QHBoxLayout { margin: 10px; }

2. QGridLayout

  • row/column

    :指定行或列的布局参数

    • 例:QGridLayout { row: 0; column: 1; }

为方便开发而创建的常用库指南