Skip to content

15. 图标

图标是用于辅助导航或理解的小型图片。它们通常出现在按钮上,可以与文本并列显示,或替代文本,也可以与菜单中的操作并列显示。通过使用易于识别的指示符,您可以使界面更易于使用。

在 PyQt6 中,您有多种不同的方式来获取并集成图标到应用程序中。本节将介绍这些选项以及各自的优缺点。

Qt 标准图标

在应用程序中添加简单图标的最简单方法是使用Qt自带的内置图标。这组图标涵盖了多种标准使用场景,包括文件操作、前后箭头以及消息框指示器。

以下是内置图标的完整列表。

Figure92

图九十二:Qt的内置图标

您会发现这组图标的适用范围较为有限。如果这对您正在开发的应用程序来说不是问题,或者您只需要为应用程序使用少量图标,那么这仍然可能是一个可行的选择。

通过当前应用程序样式使用 QStyle.standardIcon(name)QStyle.<constant> 可以访问这些图标。内置图标名称的完整列表如下所示。

SP_ArrowBackSP_DirIconSP_MediaSkipBackward
SP_ArrowDownSP_DirLinkIconSP_MediaSkipForward
SP_ArrowForwardSP_DirOpenIconSP_MediaStop
SP_ArrowLeftSP_DockWidgetCloseButtonSP_MediaVolume
SP_ArrowRightSP_DriveCDIconSP_MediaVolumeMuted
SP_ArrowUpSP_DriveDVDIconSP_MessageBoxCritical
SP_BrowserReloadSP_DriveFDIconSP_MessageBoxInformation
SP_BrowserStopSP_DriveHDIconSP_MessageBoxQuestion
SP_CommandLinkSP_DriveNetIconSP_MessageBoxWarning
SP_CustomBaseSP_FileDialogContentsViewSP_TitleBarContextHelpButton
SP_DesktopIconSP_FileDialogDetailedViewSP_TitleBarMaxButton
SP_DialogApplyButtonSP_FileDialogEndSP_TitleBarMenuButton
SP_DialogCancelButtonSP_FileDialogInfoViewSP_TitleBarMinButton
SP_DialogCloseButtonSP_FileDialogListViewSP_TitleBarNormalButton
SP_DialogDiscardButtonSP_FileDialogNewFolderSP_TitleBarShadeButton
SP_DialogHelpButtonSP_FileDialogStartSP_TitleBarUnshadeButton
SP_DialogNoButtonSP_FileDialogToParentSP_ToolBarHorizontalExtensionButton
SP_DialogOkButtonSP_FileIconSP_ToolBarVerticalExtensionButton
SP_DialogResetButtonSP_FileLinkIconSP_TrashIcon
SP_DialogSaveButtonSP_MediaPauseSP_VistaShield
SP_DialogYesButtonSP_MediaPlaySP_DirClosedIcon
SP_MediaSeekBackwardSP_DirHomeIconSP_MediaSeekForward

您可以通过以下方式直接通过 QStyle 命名空间访问这些图标。

python
icon = QStyle.standardIcon(QStyle.SP_MessageBoxCritical)
button.setIcon(icon)

您也可以使用特定控件的样式对象。无论使用哪一个都无所谓,因为我们只是访问内置控件而已。

python
style = button.style() # 从控件中获取 QStyle 对象
icon = style.standardIcon(style.SP_MessageBoxCritical)
button.setIcon(icon)

如果您在标准图标集找不到所需的图标,您需要使用以下所述的其他方法之一。

tips

虽然您可以混合搭配不同图标集中的图标,但最好在整个应用程序中使用单一样式,以保持应用程序的连贯性。

图标文件

如果标准图标不符合您的需求,或者您需要一些不可用的图标,您可以使用任何自定义图标。图标可以是您平台上 Qt 支持的任何图像类型,尽管对于大多数使用场景,PNG 或 SVG 图像更可取。

tips

要获取您平台上支持的图像格式列表,您可以调用 QtGui.QImageReader.supportedImageFormats() 方法。

图标集

如果您不是图形设计师,使用现成的图标集可以节省大量时间(和麻烦)。网上有成千上万种这样的图标集,其许可证因在开源软件或商业软件中的使用而异。

在这本书和示例应用程序中,我使用了 Fugue 图标集,该图标集也可免费用于您的软件,但需注明作者。Tango图标集是一个为Linux系统开发的庞大图标集,但它没有许可要求,因此可以在任何平台上使用。

资源描述许可证
Fugue byp.yusukekamiyamane3,570 个 16x16 像素的 PNG 格式图标CC BY 3.0
Diagona byp.yusukekamiyamane400 个 16x16 和 10x10 的图标,格式为 PNG。CC BY 3.0
Tango Icons by The TangoDesktop Project使用 Tango 项目颜色主题的图标。公共领域

tips

虽然您可以控制菜单和工具栏中使用的图标大小,但在大多数情况下,建议保持默认设置。菜单中图标的标准大小为20x20像素。

information

比这更小的尺寸也可行,图标会居中显示,而不是放大显示。

创造您自己的图标

如果您不喜欢现有图标集中的任何一个,或者希望为您的应用程序打造独特风格,当然可以自行设计图标。图标可使用任何标准图形设计软件创建,并保存为带透明背景的PNG图像。图标应为正方形,且分辨率需确保在应用程序中使用时无需进行缩放。

使用图标文件

一旦您拥有图标文件(无论是来自图标集还是自行绘制),即可通过创建 QtGui.QIcon 实例并直接传入图标文件名的方式,在 Qt 应用程序中使用这些图标。

python
QtGui.QIcon("<filename>")

虽然您可以使用绝对路径(完整路径)和相对路径(部分路径)来指向您的文件,但绝对路径在分发应用程序时容易出现问题。相对路径只要图标文件存储在与脚本相同的相对位置即可正常工作,尽管在打包时管理这一点也可能较为困难。

information

为了创建图标实例,您必须已经创建了一个 QApplication 实例。为了确保这一点,您可以在源文件的顶部创建应用程序实例,或者在使用它们的控件或窗口的 __init__ 中创建 QIcon 实例。

自由桌面规范图标(Linux)

在 Linux 桌面系统中,有一个名为“自由桌面规范”(Free Desktop Specification)的标准,它为特定操作的图标定义了标准名称。

如果您的应用程序使用了这些特定的图标名称(并从主题中加载图标),那么在 Linux 上,您的应用程序将使用当前在桌面上启用的图标集。此处的目标是确保所有应用程序具有相同的用户界面风格,同时保持可配置性。

要在 Qt Designer 中使用这些功能,您需要选择下拉菜单并选择“Set Icon From Theme…”

Figure93

图九十三:选择图标主题

然后,请您输入您要使用的图标名称,例如 document-new(参见 有效名称的完整列表)。

Figure94

图九十四:选择图标主题

在代码中,您可以通过以下方式从当前活动的 Linux 桌面主题中获取图标:icon =QtGui.QIcon.fromTheme(“document-new”) 。以下代码片段将生成一个小窗口(按钮),显示当前主题中的“新建文档”图标。

Listing 92. icons/linux.py

python
from PyQt6.QtWidgets import QApplication, QPushButton
from PyQt6.QtGui import QIcon

import sys

app = QApplication(sys.argv)
button = QPushButton("Hello")
icon = QIcon.fromTheme("document-new")
button.setIcon(icon)
button.show()

app.exec()

生成的窗口在Ubuntu系统上将呈现如下外观,采用默认的图标主题。

Figure95

图九十五:Linux 自由桌面规范 “文档新建” 图标

如果您正在开发跨平台应用程序,您仍然可以在 Linux 上使用这些标准图标。为此,请为 Windows 和 macOS 使用您自己的图标,并在 Qt Designer 中创建自定义主题,使用自由桌面规范的图标名称。