Qt Theme —— 纯 qss 的 Qt 主题

简介: Qt Theme 是一个纯 QSS 实现的 Qt 主题库,支持 C++ 与 Python(PyQt/PySide),提供多种风格与配色,轻松美化界面。可通过 pip 安装或导出资源嵌入项目,兼容 WebAssembly 在线预览。

#Qt Theme —— 纯 qss 的 Qt 主题

源码地址:https://github.com/hubenchang0515/QtTheme/

Qt Theme 是一个纯 qss 的 Qt 主题项目,能够极为简单对已有项目的风格进行改进。

支持 C++、PyQt5、PyQt6、PySide2、PySide6,并以 WebAssembly 的方式在 GitHub Pages 上发布。

#安装

这里演示一下在 Python 上的使用,首先进行安装:

pip install QtTheme

#演示

#原生样式及代码

让 Deep Seek 随便帮我写个界面作为示例:

import sys
from PySide6.QtWidgets import *
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt, QTimer

class DemoWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt Widget 演示界面")
        self.setGeometry(100, 100, 800, 600)

        # 创建中心widget和主布局
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)

        # 添加功能区域
        self.create_input_section(main_layout)
        self.create_selection_section(main_layout)
        self.create_display_section(main_layout)
        self.create_progress_section(main_layout)

        # 添加状态栏
        self.statusBar().showMessage("就绪")

        # 初始化进度条
        self.progress_value = 0
        self.update_progress()

    def create_input_section(self, layout):
        group = QGroupBox("输入控件")
        grid = QGridLayout()

        # 文本输入
        self.line_edit = QLineEdit()
        self.line_edit.setPlaceholderText("单行文本输入...")
        grid.addWidget(QLabel("单行文本:"), 0, 0)
        grid.addWidget(self.line_edit, 0, 1)

        # 多行文本
        self.text_edit = QTextEdit()
        self.text_edit.setPlaceholderText("多行文本输入...")
        grid.addWidget(QLabel("多行文本:"), 1, 0)
        grid.addWidget(self.text_edit, 1, 1)

        # 数字输入
        self.spin_box = QSpinBox()
        self.spin_box.setRange(0, 100)
        grid.addWidget(QLabel("数字输入:"), 2, 0)
        grid.addWidget(self.spin_box, 2, 1)

        group.setLayout(grid)
        layout.addWidget(group)

    def create_selection_section(self, layout):
        group = QGroupBox("选择控件")
        hbox = QHBoxLayout()

        # 复选框
        vbox = QVBoxLayout()
        self.check1 = QCheckBox("选项1")
        self.check2 = QCheckBox("选项2")
        vbox.addWidget(self.check1)
        vbox.addWidget(self.check2)
        hbox.addLayout(vbox)

        # 单选框
        vbox = QVBoxLayout()
        self.radio1 = QRadioButton("单选1")
        self.radio2 = QRadioButton("单选2")
        self.radio1.setChecked(True)
        vbox.addWidget(self.radio1)
        vbox.addWidget(self.radio2)
        hbox.addLayout(vbox)

        # 下拉列表
        self.combo = QComboBox()
        self.combo.addItems(["选项A", "选项B", "选项C"])
        hbox.addWidget(self.combo)

        group.setLayout(hbox)
        layout.addWidget(group)

    def create_display_section(self, layout):
        group = QGroupBox("显示控件")
        hbox = QHBoxLayout()

        # 标签
        self.label = QLabel("这是一个标签")
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setStyleSheet("border: 1px solid gray; padding: 10px;")
        hbox.addWidget(self.label)

        # 图片显示
        pixmap = QPixmap(100, 50)
        pixmap.fill(Qt.blue)
        image_label = QLabel()
        image_label.setPixmap(pixmap)
        hbox.addWidget(image_label)

        # 列表控件
        self.list_widget = QListWidget()
        self.list_widget.addItems(["项目1", "项目2", "项目3"])
        hbox.addWidget(self.list_widget)

        group.setLayout(hbox)
        layout.addWidget(group)

    def create_progress_section(self, layout):
        group = QGroupBox("进度控件")
        vbox = QVBoxLayout()

        # 进度条
        self.progress_bar = QProgressBar()
        self.progress_bar.setValue(0)
        vbox.addWidget(self.progress_bar)

        # 滑块
        self.slider = QSlider(Qt.Horizontal)
        self.slider.setRange(0, 100)
        self.slider.valueChanged.connect(self.on_slider_changed)
        vbox.addWidget(self.slider)

        # 控制按钮
        btn_layout = QHBoxLayout()
        self.start_btn = QPushButton("开始进度")
        self.start_btn.clicked.connect(self.start_progress)
        self.reset_btn = QPushButton("重置")
        self.reset_btn.clicked.connect(self.reset_progress)
        btn_layout.addWidget(self.start_btn)
        btn_layout.addWidget(self.reset_btn)

        vbox.addLayout(btn_layout)
        group.setLayout(vbox)
        layout.addWidget(group)

    def on_slider_changed(self, value):
        self.progress_bar.setValue(value)
        self.statusBar().showMessage(f"滑块值: {value}")

    def start_progress(self):
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_progress)
        self.timer.start(100)

    def update_progress(self):
        self.progress_value += 1
        if self.progress_value > 100:
            self.timer.stop()
            return
        self.progress_bar.setValue(self.progress_value)
        self.slider.setValue(self.progress_value)

    def reset_progress(self):
        self.progress_value = 0
        self.progress_bar.setValue(0)
        self.slider.setValue(0)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DemoWindow()
    window.show()
    sys.exit(app.exec())

运行起来看看:

#设置全局样式

导入 QtTheme 并设置样式:

import QtTheme.PySide6 as QtTheme

class DemoWindow(QMainWindow):
    def __init__(self):
        # 省略...

        # 设置全局样式
        self.setStyleSheet(QtTheme.getThemeStyle('Flat', 'Dark', 'Blue', 'Pink'))

#设置颜色

最后根据需要,通过 QWidget.setProperty 对 widgets 设置颜色:

    def create_progress_section(self, layout):
        # 省略 ...

        # 给按钮设置颜色
        self.start_btn.setProperty("Color", "Primary")
        self.reset_btn.setProperty("Color", "Danger")

#导出资源

你也可以不安装 QtTheme,而是通过 在线页面 导出资源文件, 通过 RCC 将其加入你的项目:

pyside6-rcc -o resource.py QtTheme.qrc

只需要修改导入方式,其余代码一致:

from PySide6.QtCore import QFile
import resource  # 导入生成的 resource.py

class DemoWindow(QMainWindow):
    def __init__(self):
        # 省略...

        qss = QFile(":/QtTheme/theme/Flat/Dark/Blue/Pink.qss")
        qss.open(QFile.OpenModeFlag.ReadOnly)
        self.setStyleSheet(qss.readAll().data().decode())

Qt Theme —— 纯 qss 的 Qt 主题》 是转载文章,点击查看原文

相关文章
|
2天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
12天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
476 199
|
4天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
597 157
|
4天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
10天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
574 46