PyQt QtAwesome详解:为Qt应用注入字体图标的魅力
- 一、QtAwesome详解
-
- 1、核心功能与优势:
- [2、核心 API 详解 (`QtAwesome.icon()`)](#2、核心 API 详解 (
QtAwesome.icon())) - 3、图标名称格式
- 4、注意事项
- 5、总结
- 二、示例代码
一、QtAwesome详解
QtAwesome 是一个强大的 Python 库,专为 PyQt 或 PySide 应用程序设计,用于便捷地集成和使用 Font Awesome 和 其他图标字体 。它提供了一个简洁的接口,允许开发者像使用 QFont 一样加载图标字体,并通过字符串标识符(如 "fa5.heart")来访问特定的图标,最终将其作为 QIcon 对象使用在按钮、菜单项、标签等 Qt 控件上。
1、核心功能与优势:
- Font Awesome 集成:
- 无缝支持 Font Awesome 图标(包括 Free 和 Pro 版本)。开发者无需手动下载、管理字体文件或处理字符映射。
- 支持多个 Font Awesome 版本(如 4.x, 5.x, 6.x),通过前缀(如
"fa5.","fa6.")指定。
- 其他图标字体支持:
- 除了 Font Awesome,
QtAwesome也支持集成其他流行的开源图标字体库,例如:- Elusive Icons
- Material Design Icons (Community)
- Remix Icon
- Typicons
- ... (具体支持的库可能随版本更新而变化)
- 为这些库提供了类似的访问接口。
- 除了 Font Awesome,
- Qt 原生支持:
- 直接返回
QIcon对象,与 Qt 的控件系统(如QPushButton.setIcon,QAction.setIcon,QLabel.setPixmap)完美兼容。
- 直接返回
- 简便的 API:
- 主要接口是
QtAwesome类(通常实例化为qta)及其icon()方法。 - 通过字符串名称即可请求图标,无需记忆 Unicode 码点。
- 主要接口是
- 样式定制:
- 支持在获取图标时动态设置颜色、缩放比例(尺寸)、偏移量等属性。
- 颜色使用 Qt 的
QColor表示。
- 资源管理:
- 库内部管理字体文件的加载和注册到
QFontDatabase,开发者只需关心使用图标名称。 - 自动处理图标的缺失情况(可通过
QtAwesome.missing()获取一个占位图标)。
- 库内部管理字体文件的加载和注册到
2、核心 API 详解 (QtAwesome.icon())
python
def icon(self, name, *args, **kwargs):
"""
根据给定的图标名称和可选参数创建一个 QIcon。
参数:
name (str): 图标的名称。格式通常为 "{prefix}.{iconname}"。
例如: "fa5s.heart", "fa5r.smile", "mdi.account", "ri.base-station-line"。
前缀标识字体集和风格(如果有)。
color (QColor, str): 可选。设置图标的颜色。可以是 QColor 对象或颜色名称字符串(如 'red', '#ff0000')。
color_disabled (QColor, str): 可选。设置图标在禁用状态下的颜色。
color_active (QColor, str): 可选。设置图标在激活状态下的颜色。
color_selected (QColor, str): 可选。设置图标在被选中状态下的颜色。
scale_factor (float): 可选。缩放图标。默认 1.0 表示原始大小。
offset (QPointF, tuple): 可选。图标的偏移量,可以是 QPointF 或 (x, y) 元组。
rotate (int): 可选。旋转图标(角度,顺时针)。
flip (bool): 可选。水平翻转图标。
flop (bool): 可选。垂直翻转图标。
**kwargs: 其他传递给底层 QPainter 的选项(较少使用)。
返回:
QIcon: 生成的图标对象。
"""
使用步骤:
-
安装:
bashpip install qtawesome -
导入:
pythonimport qtawesome as qta -
获取图标:
python# 基本用法:获取一个 Font Awesome Solid 风格的爱心图标 heart_icon = qta.icon('fa5s.heart') # 获取 Material Design Icons 的账户图标 account_icon = qta.icon('mdi.account') # 带样式的图标:红色的 Font Awesome Regular 风格的笑脸图标,放大到 1.5 倍 smile_icon = qta.icon('fa5r.smile', color='red', scale_factor=1.5) # 使用 QColor 指定颜色 from PyQt5.QtGui import QColor blue_gear_icon = qta.icon('fa5s.cog', color=QColor('blue')) -
在 Qt 控件中使用:
python# 设置按钮图标 my_button = QPushButton() my_button.setIcon(qta.icon('fa5s.home')) # 设置菜单项图标 exit_action = QAction() exit_action.setIcon(qta.icon('fa5s.sign-out-alt')) menu.addAction(exit_action) # 在标签中显示为像素图 (需要指定尺寸) my_label = QLabel() pixmap = qta.icon('mdi.weather-sunny').pixmap(32, 32) # 生成 32x32 的 QPixmap my_label.setPixmap(pixmap) -
处理图标缺失:
python# 尝试获取一个可能不存在的图标 try: some_icon = qta.icon('some.unknown.icon') except: # 使用占位图标 some_icon = qta.missing_icon() # 或者 qta.icon() 在出错时会自动返回占位图标(取决于版本)
3、图标名称格式
图标名称通常由两部分组成,用点号 . 分隔:
- 前缀 (
prefix): 指定图标字体集和可能的风格。fa5s: Font Awesome 5 Solid (实心)fa5r: Font Awesome 5 Regular (常规)fa5b: Font Awesome 5 Brands (品牌)mdi: Material Design Icons (Community)ri: Remix Iconel: Elusive Iconstypcn: Typicons- ... (其他库的前缀)
- 图标名 (
iconname): 对应图标字体库中图标的名称。这与你在 Font Awesome 官网或其他图标库官网上看到的名称一致。例如:heart,home,cog,user,envelope(Font Awesome)account,home,cog,weather-sunny(MDI)home-line,settings-line,notification-badge-line(Remix Icon)
4、注意事项
- 版本依赖:
qtawesome库本身会捆绑特定版本的图标字体文件。确保你使用的图标名称与你安装的qtawesome版本所支持的图标库版本匹配。新版本的qtawesome会添加对新版 Font Awesome 和其他库的支持。 - 图标可用性: 不是所有图标库的所有图标在所有风格的
qtawesome中都可用。主要支持集中在 Font Awesome Free 的常用图标上。Pro 版本或某些特定图标可能需要额外配置或不受支持。 - 高 DPI 缩放: QtAwesome 图标能较好地适应高 DPI 显示,因为它们是矢量字体渲染的。
- 动态更新: 通过
icon()方法生成的QIcon是动态的。如果你在获取图标后改变了应用程序的样式(比如主题色),并且希望图标颜色随之改变,你可能需要重新获取图标或使用更高级的样式管理。
5、总结
QtAwesome 极大地简化了在 PyQt/PySide 应用中使用高质量矢量图标的过程。它通过一个直观的 API 隐藏了字体加载和字符映射的复杂性,让开发者能够专注于使用丰富的图标集来美化界面。无论是使用流行的 Font Awesome 还是其他开源图标库,QtAwesome 都是一个非常值得使用的工具。
二、示例代码
1、源码分享
python
import sys
from PIL import Image
import numpy as np
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QImage
from PyQt6.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox, QWidget, QVBoxLayout, QHBoxLayout, \
QLineEdit, QSpinBox, QLabel, QScrollArea, QGridLayout, QFrame
from mainWindow import Ui_MainWindow
import qtawesome as qta
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QtAwesome 图标浏览器")
self.setGeometry(100, 100, 900, 700)
# ==============================================
# ✅ 最稳定:直接内置所有图标名称列表(永不报错)
# ==============================================
self.all_icons = [
'fa5s.airplane', 'fa5s.align-center', 'fa5s.align-justify', 'fa5s.align-left',
'fa5s.align-right', 'fa5s.ambulance', 'fa5s.android', 'fa5s.angle-double-down',
'fa5s.angle-double-left', 'fa5s.angle-double-right', 'fa5s.angle-double-up',
'fa5s.angle-down', 'fa5s.angle-left', 'fa5s.angle-right', 'fa5s.angle-up',
'fa5s.arrow-circle-down', 'fa5s.arrow-circle-left', 'fa5s.arrow-circle-right',
'fa5s.arrow-circle-up', 'fa5s.arrow-down', 'fa5s.arrow-left', 'fa5s.arrow-right',
'fa5s.arrow-up', 'fa5s.backward', 'fa5s.ban', 'fa5s.barcode', 'fa5s.bars',
'fa5s.bell', 'fa5s.book', 'fa5s.bookmark', 'fa5s.box', 'fa5s.briefcase',
'fa5s.bug', 'fa5s.building', 'fa5s.bullhorn', 'fa5s.bus', 'fa5s.calendar',
'fa5s.camera', 'fa5s.caret-down', 'fa5s.caret-left', 'fa5s.caret-right',
'fa5s.caret-up', 'fa5s.cart-plus', 'fa5s.chart-bar', 'fa5s.check',
'fa5s.check-circle', 'fa5s.check-square', 'fa5s.chevron-down',
'fa5s.chevron-left', 'fa5s.chevron-right', 'fa5s.chevron-up', 'fa5s.circle',
'fa5s.clock', 'fa5s.cloud', 'fa5s.code', 'fa5s.cog', 'fa5s.comment',
'fa5s.comments', 'fa5s.copy', 'fa5s.credit-card', 'fa5s.crop', 'fa5s.crosshairs',
'fa5s.cube', 'fa5s.cubes', 'fa5s.cut', 'fa5s.database', 'fa5s.desktop',
'fa5s.download', 'fa5s.edit', 'fa5s.ellipsis-h', 'fa5s.ellipsis-v',
'fa5s.envelope', 'fa5s.eraser', 'fa5s.exchange', 'fa5s.exclamation-circle',
'fa5s.exclamation-triangle', 'fa5s.eye', 'fa5s.eye-slash', 'fa5s.fast-backward',
'fa5s.fast-forward', 'fa5s.file', 'fa5s.file-alt', 'fa5s.film', 'fa5s.filter',
'fa5s.flag', 'fa5s.flask', 'fa5s.folder', 'fa5s.folder-open', 'fa5s.forward',
'fa5s.fullscreen', 'fa5s.gear', 'fa5s.gift', 'fa5s.github', 'fa5s.globe',
'fa5s.heart', 'fa5s.history', 'fa5s.home', 'fa5s.image', 'fa5s.inbox',
'fa5s.info', 'fa5s.info-circle', 'fa5s.key', 'fa5s.laptop', 'fa5s.lemon',
'fa5s.level-down', 'fa5s.level-up', 'fa5s.life-ring', 'fa5s.lightbulb',
'fa5s.link', 'fa5s.list', 'fa5s.lock', 'fa5s.magic', 'fa5s.magnet',
'fa5s.mail-forward', 'fa5s.mail-reply', 'fa5s.map-marker', 'fa5s.minus',
'fa5s.minus-circle', 'fa5s.mobile', 'fa5s.money', 'fa5s.moon', 'fa5s.music',
'fa5s.paper-plane', 'fa5s.pause', 'fa5s.pencil', 'fa5s.phone', 'fa5s.phone-alt',
'fa5s.play', 'fa5s.play-circle', 'fa5s.plus', 'fa5s.plus-circle', 'fa5s.power-off',
'fa5s.print', 'fa5s.qrcode', 'fa5s.question-circle', 'fa5s.redo', 'fa5s.refresh',
'fa5s.reply', 'fa5s.rocket', 'fa5s.save', 'fa5s.search', 'fa5s.server',
'fa5s.share', 'fa5s.shield-alt', 'fa5s.shopping-cart', 'fa5s.sign-in',
'fa5s.sign-out', 'fa5s.sliders-h', 'fa5s.smile', 'fa5s.sort', 'fa5s.spinner',
'fa5s.star', 'fa5s.step-backward', 'fa5s.step-forward', 'fa5s.stop', 'fa5s.sun',
'fa5s.sync', 'fa5s.table', 'fa5s.tablet', 'fa5s.tag', 'fa5s.tags', 'fa5s.tasks',
'fa5s.taxi', 'fa5s.terminal', 'fa5s.th', 'fa5s.th-large', 'fa5s.th-list',
'fa5s.ticket', 'fa5s.times', 'fa5s.times-circle', 'fa5s.trash', 'fa5s.tree',
'fa5s.trophy', 'fa5s.truck', 'fa5s.undo', 'fa5s.unlock', 'fa5s.upload',
'fa5s.user', 'fa5s.user-plus', 'fa5s.users', 'fa5s.wrench',
'fa5.brands.github', 'fa5.brands.google', 'fa5.brands.twitter', 'fa5.brands.facebook',
'fa5.brands.instagram', 'fa5.brands.linkedin', 'fa5.brands.youtube', 'fa5.brands.weixin',
'fa5.brands.qq', 'fa5.brands.weibo',
]
self.filtered_icons = self.all_icons
# 主界面
central_widget = QWidget()
self.setCentralWidget(central_widget)
main_layout = QVBoxLayout(central_widget)
# 搜索栏
top_layout = QHBoxLayout()
self.search_input = QLineEdit()
self.search_input.setPlaceholderText("搜索图标名称(如:play、save、user)")
self.search_input.textChanged.connect(self.filter_icons)
top_layout.addWidget(self.search_input)
top_layout.addWidget(QLabel("图标大小:"))
self.size_spin = QSpinBox()
self.size_spin.setRange(16, 64)
self.size_spin.setValue(32)
self.size_spin.valueChanged.connect(self.refresh_icons)
top_layout.addWidget(self.size_spin)
main_layout.addLayout(top_layout)
# 滚动区域
self.scroll_area = QScrollArea()
self.scroll_area.setWidgetResizable(True)
self.icon_container = QWidget()
self.icon_layout = QGridLayout(self.icon_container)
self.scroll_area.setWidget(self.icon_container)
main_layout.addWidget(self.scroll_area)
self.refresh_icons()
def filter_icons(self):
keyword = self.search_input.text().lower()
self.filtered_icons = [name for name in self.all_icons if keyword in name.lower()]
self.refresh_icons()
def refresh_icons(self):
# 清空旧控件
while self.icon_layout.count() > 0:
child = self.icon_layout.takeAt(0)
if child.widget():
child.widget().deleteLater()
icon_size = self.size_spin.value()
row, col = 0, 0
max_cols = 8
for icon_name in self.filtered_icons:
try:
icon = qta.icon(icon_name, color="#2c7fb8")
btn = QLabel()
btn.setPixmap(icon.pixmap(icon_size, icon_size))
btn.setAlignment(Qt.AlignCenter)
btn.setToolTip(f"图标名:{icon_name}")
label = QLabel(icon_name)
label.setAlignment(Qt.AlignCenter)
label.setWordWrap(True)
frame = QFrame()
frame_layout = QVBoxLayout(frame)
frame_layout.addWidget(btn)
frame_layout.addWidget(label)
frame.setStyleSheet("QFrame{margin:5px; padding:5px;}")
self.icon_layout.addWidget(frame, row, col)
col += 1
if col >= max_cols:
col = 0
row += 1
except:
continue
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
2、库安装
python
pip install qtawesome
3、效果展示

