使用.qrc文件(pyside6-rcc

Qt 资源系统是一种用于在应用程序中存储二进制文件的机制。

文件将被嵌入到应用程序中,并且可以通过使用以:/开头的特殊文件名,通过QFile类以及接受文件名的QIconQPixmap类的构造函数进行访问。

最常见的用途包括自定义图像、图标、字体等。

在本教程中,您将学习如何加载自定义图像作为按钮图标。

为了获得灵感,我们将尝试改编Qt中的多媒体播放器示例。

正如你在下图中所看到的,用于媒体操作(播放、暂停、停止等)的QPushButton使用了默认的图标。

Multimedia Player Qt Example

你可以通过设计图标使应用程序更具吸引力,但如果你不想设计它们,你可以下载并使用它们。

下载 图标

New Multimedia icons

您可以在Qt资源系统网站上找到更多关于rcc命令、.qrc文件格式以及资源系统的信息。

.qrc 文件

在运行任何命令之前,将有关资源的信息添加到.qrc文件中。 在以下示例中,注意资源是如何在icons.qrc中列出的。

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>icons/play.png</file>
    <file>icons/pause.png</file>
    <file>icons/stop.png</file>
    <file>icons/previous.png</file>
    <file>icons/forward.png</file>
</qresource>
</RCC>

生成一个Python文件

现在icons.qrc文件已经准备好,使用pyside6-rcc工具生成一个包含资源二进制信息的Python类

要做到这一点,我们需要运行:

pyside6-rcc icons.qrc -o rc_icons.py

-o 选项允许您指定输出文件名,在这种情况下是 rc_icons.py

要使用生成的文件,请在您的主Python文件的顶部添加以下导入:

import rc_icons

代码中的更改

当你修改一个现有的示例时,你需要修改player.py文件。在顶部,更改

from PySide6.QtGui import QIcon, QKeySequence

至:

from PySide6.QtGui import QIcon, QKeySequence, QPixmap

在导入下方,添加以下内容:

import rc_icons

MainWindow.__init__()函数中,将加载主题图标的代码替换为您的自定义图标:

playIcon = QIcon(QPixmap(":/icons/play.png"))
self._play_action = tool_bar.addAction(playIcon, "Play")

当为所有图标执行此操作时,您的类的构造函数应如下所示:

def __init__(self):
    super().__init__()

    self._playlist = []
    self._playlist_index = -1
    self._audio_output = QAudioOutput()
    self._player = QMediaPlayer()
    self._player.setAudioOutput(self._audio_output)

    self._player.errorOccurred.connect(self._player_error)

    tool_bar = QToolBar()
    self.addToolBar(tool_bar)

    file_menu = self.menuBar().addMenu("&File")
    icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentOpen)
    open_action = QAction(icon, "&Open...", self,
                          shortcut=QKeySequence.Open, triggered=self.open)
    file_menu.addAction(open_action)
    tool_bar.addAction(open_action)
    icon = QIcon.fromTheme(QIcon.ThemeIcon.ApplicationExit)
    exit_action = QAction(icon, "E&xit", self,
                          shortcut="Ctrl+Q", triggered=self.close)
    file_menu.addAction(exit_action)

    play_menu = self.menuBar().addMenu("&Play")
    playIcon = QIcon(QPixmap(":/icons/play.png"))
    self._play_action = tool_bar.addAction(playIcon, "Play")
    self._play_action.triggered.connect(self._player.play)
    play_menu.addAction(self._play_action)

    previousIcon = QIcon(QPixmap(":/icons/previous.png"))
    self._previous_action = tool_bar.addAction(previousIcon, "Previous")
    self._previous_action.triggered.connect(self.previous_clicked)
    play_menu.addAction(self._previous_action)

    pauseIcon = QIcon(QPixmap(":/icons/pause.png"))
    self._pause_action = tool_bar.addAction(pauseIcon, "Pause")
    self._pause_action.triggered.connect(self._player.pause)
    play_menu.addAction(self._pause_action)

    nextIcon = QIcon(QPixmap(":/icons/forward.png"))
    self._next_action = tool_bar.addAction(nextIcon, "Next")
    self._next_action.triggered.connect(self.next_clicked)
    play_menu.addAction(self._next_action)

    stopIcon = QIcon(QPixmap(":/icons/stop.png"))
    self._stop_action = tool_bar.addAction(stopIcon, "Stop")
    self._stop_action.triggered.connect(self._ensure_stopped)
    play_menu.addAction(self._stop_action)

    # many lines were omitted

执行示例

通过调用 python main.py 来运行应用程序,以查看新的图标集:

New Multimedia Player Qt Example