QSS样式笔记

PyQt5 QSS(Qt Style Sheets)完整语法手册

Qt Style Sheets(QSS)是 PyQt5 / PySide2 用于定义控件外观的语言,
语法类似 CSS,但有自己的一套规则和限制。


🧱 一、基础语法结构

QSS 基本结构与 CSS 类似:

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

多个样式可连写:

QPushButton, QToolButton {
    color: white;
    background-color: #3b5998;
}

🧩 二、选择器类型

1️⃣ 控件名选择器

直接使用控件类名:

QPushButton { color: white; }
QLineEdit { background-color: #eee; }

2️⃣ 对象名选择器(#)

使用 setObjectName() 指定后,用 # 选择:

#submitBtn { background-color: green; }

3️⃣ 类选择器(.)

QSS 也支持 property 属性模拟 class:

button.setProperty("class", "danger")

然后:

QPushButton.danger { background-color: red; }

4️⃣ 继承层级选择器

QGroupBox QPushButton {
    color: blue;
}

5️⃣ 子控件选择器

指定控件内部的子元素:

QComboBox QAbstractItemView { background: white; }
QScrollBar::handle { background: gray; }

🧠 三、伪状态(Pseudo-States)

状态 说明
:hover 鼠标悬停时
:pressed 鼠标按下
:checked 复选框、单选框、开关选中状态
:unchecked 未选中
:disabled 禁用状态
:enabled 启用状态
:focus 获取焦点时
:read-only 只读状态
:on / :off 菜单、按钮的切换状态
:indeterminate 复选框不确定状态

示例:

QPushButton:hover { background-color: #5b9bd5; }
QPushButton:pressed { background-color: #2e75b6; }
QPushButton:disabled { color: gray; }

🎨 四、常用属性分类

1️⃣ 背景与前景

background-color: #f0f0f0;
background-image: url(:/img/bg.png);
color: #333;

2️⃣ 边框样式

border: 1px solid #ccc;
border-radius: 6px;
border-top: 2px dashed red;

3️⃣ 字体样式

font-family: "Microsoft YaHei";
font-size: 14px;
font-weight: bold;
font-style: italic;

4️⃣ 内外边距

padding: 4px 8px;
margin: 2px;

5️⃣ 对齐方式(仅部分控件支持)

qproperty-alignment: AlignCenter;

6️⃣ 尺寸与几何属性

min-width: 100px;
max-width: 300px;
min-height: 30px;

🔸 五、控件专属伪元素(Sub-controls)

某些控件内部有可独立设置的“子部分”:

QScrollBar::handle
QScrollBar::add-line
QScrollBar::sub-line
QComboBox::drop-down
QProgressBar::chunk
QSlider::groove
QSlider::handle

示例:

QScrollBar::handle:vertical {
    background: #aaa;
    border-radius: 3px;
}
QComboBox::drop-down {
    border-left: 1px solid #666;
    width: 20px;
}

🧰 六、属性绑定(qproperty)

可以绑定 Qt 属性:

qproperty-icon: url(:/icons/add.png);
qproperty-alignment: AlignCenter;

适用于:QLabel, QPushButton, QCheckBox 等。


⚙️ 七、继承与层叠规则

  1. 控件自己的样式 > 父控件样式 > 全局样式
  2. 相同选择器后定义的样式会覆盖前面的
  3. QSS 不会自动继承字体和颜色,除非明确定义

🧱 八、函数与值类型

QSS 支持一些 Qt 特有函数:

rgb(255, 0, 0)
rgba(0, 0, 0, 0.5)
url(:/images/bg.png)
qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 red, stop:1 blue)

示例:

QProgressBar::chunk {
    background: qlineargradient(
        x1:0, y1:0, x2:0, y2:1,
        stop:0 #05B8CC, stop:1 #0078A8
    );
}

💡 九、示例:综合界面样式

QWidget {
    background-color: #2e2e2e;
    color: #f0f0f0;
    font-family: "Microsoft YaHei";
    font-size: 14px;
}

QLineEdit {
    background-color: #3a3a3a;
    border: 1px solid #555;
    border-radius: 5px;
    padding: 4px 8px;
}

QPushButton {
    background-color: #0078d7;
    border: none;
    color: white;
    border-radius: 6px;
    padding: 6px 12px;
}
QPushButton:hover { background-color: #0096ff; }
QPushButton:pressed { background-color: #005a9e; }
QPushButton:disabled { background-color: #555; color: #888; }

🧭 十、调试技巧

  1. 可将 .qss 文件单独保存并加载:

    with open("style.qss", "r") as f:
        app.setStyleSheet(f.read())
    
  2. Qt Designer 里可直接预览样式。

  3. 若样式不生效,检查:

    • 控件名称是否正确
    • 样式层级冲突
    • 控件是否启用(enabled)

✅ 总结

QSS = CSS for Qt
语法结构与 CSS 相似,但:

  • 控件名取代 HTML 标签
  • 属性集有限
  • 支持 Qt 特有的伪元素和属性绑定

可通过 QSS 快速构建现代化 UI,而无需修改控件逻辑。


推荐实践:

  • 用全局样式控制整体基调
  • 对关键控件使用 #id.class 微调
  • 将 QSS 独立文件化方便维护

使用开源样式

pip下载方法百度一下

导入和使用

from qt_material import apply_stylesheet


if __name__ == "__main__":

    # 该变量用来通知结束线程

    stop_event = threading.Event()

    # 定义线程锁,同时只能执行更新字典与保存字典的一个操作

    thread_lock = threading.Lock()

  
    # 切换工作目录为当前文件所在目录(以便正确创建文件夹)

    file_path = pathlib.Path(mytools.resource_path()).parent

    os.chdir(file_path)

  

    # 主线程是主窗口,其下有子线程刷新活动状态

    app = QApplication(sys.argv)

    # 2. 应用主题

    # 'dark_teal.xml' 是主题文件名,你可以换成其他的

    apply_stylesheet(

        app,

        theme='light_blue_500.xml',

        extra={#这个属性用来调整一些参数。该开源样式会覆盖直接修改的样式,所以要通过直接修改该属性来修改样式

            'font_family': 'Microsoft YaHei',

            'font_size': '18px',      # 全局字体大小

        }

    )

    # app.setAttribute(Qt.AA_EnableHighDpiScaling)

    window = MyMainWindow()

    window.setFixedSize(800, 600)   #固定窗口大小,不可拉伸

    window.setWindowIcon(QIcon(to_image(imgaes.images["icon"])))

    window.setWindowTitle("屏幕视奸器")

    window.show()

  

    sys.exit(app.exec_())  # 进入事件循环
posted @ 2026-07-02 17:57  畅畅c  阅读(0)  评论(0)    收藏  举报