Qt-Material 项目:为 PyQt/PySide 应用添加 Material Design 风格
2025-07-10 08:29:50作者:何举烈Damon
项目概述
Qt-Material 是一个为 PySide6、PySide2、PyQt5 和 PyQt6 提供 Material Design 风格样式表的项目。它可以让你的 Qt 应用界面获得类似 Google Material Design 的现代化视觉效果,包括丰富的颜色主题、动画效果和一致的 UI 元素设计。
核心功能
- 多种预设主题:提供 19 种内置主题(9 种深色和 10 种浅色)
- 自定义主题支持:可以创建和使用自己的颜色主题
- 运行时主题切换:支持应用运行期间动态更换主题
- 密度缩放:调整 UI 元素的紧凑程度
- 特殊按钮样式:提供危险、警告、成功等特殊状态按钮
- 字体自定义:可修改应用的默认字体
安装与基本使用
安装非常简单,只需使用 pip 命令:
pip install qt-material
基本使用示例:
import sys
from PySide6 import QtWidgets
from qt_material import apply_stylesheet
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
# 应用深色蓝绿色主题
apply_stylesheet(app, theme='dark_teal.xml')
window.show()
app.exec_()
主题系统
查看可用主题
from qt_material import list_themes
print(list_themes())
输出示例:
['dark_amber.xml', 'dark_blue.xml', 'dark_cyan.xml', ..., 'light_teal.xml', 'light_yellow.xml']
创建自定义主题
- 使用 [Material Design 颜色工具] 选择配色方案
- 导出为 Android XML 格式
- 保存为
.xml
文件 - 在代码中引用自定义主题文件
示例主题文件格式:
<resources>
<color name="primaryColor">#00e5ff</color>
<color name="primaryLightColor">#6effff</color>
<color name="secondaryColor">#f5f5f5</color>
<color name="secondaryLightColor">#ffffff</color>
<color name="secondaryDarkColor">#e6e6e6</color>
<color name="primaryTextColor">#000000</color>
<color name="secondaryTextColor">#000000</color>
</resources>
高级功能
特殊按钮样式
extra = {
'danger': '#dc3545', # 红色危险按钮
'warning': '#ffc107', # 黄色警告按钮
'success': '#17a2b8', # 绿色成功按钮
'font_family': 'Roboto' # 自定义字体
}
apply_stylesheet(app, 'light_cyan.xml', invert_secondary=True, extra=extra)
使用特殊按钮样式:
button.setProperty('class', 'danger') # 设置为危险按钮
自定义样式表
可以创建自定义 CSS 文件扩展或覆盖默认样式:
QPushButton {
color: {QTMATERIAL_SECONDARYCOLOR};
text-transform: none;
background-color: {QTMATERIAL_PRIMARYCOLOR};
}
.big_button {
height: 64px;
}
应用自定义样式:
apply_stylesheet(app, theme='light_blue.xml', css_file='custom.css')
运行时主题切换
继承 QtStyleTools
类实现运行时主题切换:
from qt_material import QtStyleTools
class MainWindow(QMainWindow, QtStyleTools):
def __init__(self):
super().__init__()
# 初始化UI...
self.apply_stylesheet(self, 'dark_teal.xml')
导出主题
可以将主题导出为独立的 QSS 和资源文件,用于非 Python 环境:
from qt_material import export_theme
export_theme(
theme='dark_teal.xml',
qss='dark_teal.qss',
rcc='resources.rcc',
output='theme',
prefix='icon:/',
extra={'font_family': 'monoespace', 'density_scale': '0'}
)
密度缩放
通过 density_scale
参数调整 UI 元素的紧凑程度:
extra = {'density_scale': '-2'} # 值范围通常为 -3 到 +3
apply_stylesheet(app, 'default', extra=extra)
常见问题
QMenu 样式问题
不同 Qt 后端和操作系统对 QMenu 的渲染方式不同,可以通过额外参数调整:
extra['QMenu'] = {
'height': 50,
'padding': '50px 50px 50px 50px' # 上、右、下、左
}
最佳实践
- 导入顺序:确保在导入 PyQt/PySide 之后再导入 qt_material
- 主题预览:使用示例程序预览所有主题效果
- 自定义主题:从现有主题开始修改,逐步调整颜色
- 性能考虑:复杂的自定义样式可能会影响界面响应速度
Qt-Material 为 Python Qt 应用提供了简单而强大的 Material Design 实现方式,通过灵活的配置选项,开发者可以轻松创建美观、现代的应用程序界面。