用 QFluentWidgets 美化 PySide6 介面
PyQt-Fluent-Widgets / QFluentWidgets 是一套 Fluent Design 風格的 Qt 元件庫。官方文件預設範例多半寫 PyQt5,但同一套 API 也有 PySide6 專用套件:PySide6-Fluent-Widgets。import 名稱一律是 qfluentwidgets。
結論:可以,而且很適合拿來「美化」PySide6——多數情況只要把 QPushButton 換成 PushButton,再呼叫 setTheme(),外觀就會明顯現代化。
版本對照(很重要)
| 你用的 Qt binding | 要安裝的套件 |
|---|---|
| PyQt5 | PyQt-Fluent-Widgets |
| PyQt6 | PyQt6-Fluent-Widgets |
| PySide2 | PySide2-Fluent-Widgets |
| PySide6 | PySide6-Fluent-Widgets |
注意:
- 不要同時安裝 上述多個套件,它們的 Python package 名稱都是
qfluentwidgets,會互相覆寫。 - 不要混用 PySide 與 PyQt(例如程式用 PySide6,卻裝了 PyQt 版 Fluent),容易直接崩潰。
- 文件站:pyqt-fluent-widgets.readthedocs.io;安裝說明亦可參考 qfluentwidgets.com/pages/install。
授權為 GPLv3(開源版)。商業閉源產品需自行評估授權,或考慮官方 Pro 方案。
安裝(PySide6)
# 建議獨立虛擬環境
pip install PySide6
# lite:一般元件足夠
pip install PySide6-Fluent-Widgets -i https://pypi.org/simple/
# full:含 AcrylicLabel 等材質效果
pip install "PySide6-Fluent-Widgets[full]" -i https://pypi.org/simple/
用 uv:
uv add PySide6 "PySide6-Fluent-Widgets"
若出現 ImportError: cannot import name 'XXX' from 'qfluentwidgets',多半是版本過舊,改用官方 PyPI 來源重裝最新版。
較新的 PySide6 在 Windows 11 上偶有 QStyle 衝突導致樣式異常;官方建議可暫時鎖在例如 6.7.2 再回報問題。
核心用法:換元件名即 可
QFluentWidgets 很多元件是「帶 Fluent 樣式的 Qt 控件」。API 與原生控件相近,學習成本低:
| 原生 Qt | QFluentWidgets |
|---|---|
QPushButton | PushButton / PrimaryPushButton |
QLabel | BodyLabel / TitleLabel / SubtitleLabel |
QLineEdit | LineEdit / SearchLineEdit |
QCheckBox | CheckBox |
QComboBox | ComboBox |
QSlider | Slider |
QProgressBar | ProgressBar / ProgressRing |
另外還有原生沒有、但桌面 App 很常用的:InfoBar、Flyout、MessageBox、NavigationInterface、FluentWindow、SettingCard 等。
最小美化範例
import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout
from qfluentwidgets import (
BodyLabel,
PushButton,
SwitchButton,
Theme,
setTheme,
)
class MyWindow(QWidget):
def __init__(self) -> None:
super().__init__()
self.setWindowTitle("My First Fluent App")
self.resize(400, 220)
self.label = BodyLabel("歡迎使用 PySide6-Fluent-Widgets", self)
self.button = PushButton("點擊我", self)
self.switch = SwitchButton(self)
self.button.clicked.connect(self.on_button_clicked)
self.switch.checkedChanged.connect(self.on_switch_toggled)
layout = QVBoxLayout(self)
layout.setSpacing(20)
layout.setContentsMargins(30, 30, 30, 30)
layout.addWidget(self.label)
layout.addWidget(self.button)
layout.addWidget(self.switch)
layout.addStretch(1)
def on_button_clicked(self) -> None:
self.label.setText("按鈕被點擊了!")
def on_switch_toggled(self, is_checked: bool) -> None:
self.label.setText(f"開關狀態:{'開啟' if is_checked else '關閉'}")
if __name__ == "__main__":
app = QApplication(sys.argv)
setTheme(Theme.DARK) # LIGHT / DARK / AUTO
window = MyWindow()
window.show()
sys.exit(app.exec())
你會看到圓角按鈕、懸停效果與切換動畫——不用自己寫一長串 QSS。