使用.qrc
文件(pyside6-rcc
)#
Qt资源系统是一个在应用程序中存储二进制文件的机制。
文件将嵌入到应用程序中,并由QFile
类以及接受文件名的QIcon
和QPixmap
类的构造函数使用以:/
开头的特殊文件名访问。
最常见的使用是为自定义图像、图标、字体等。
在本教程中,您将学习如何将自定义图像作为按钮图标加载。
为了启发灵感,我们将尝试从Qt的媒体播放器示例进行适配。
如图所示,以下图像中的用于媒体操作的QPushButton
使用的是针对此类操作的默认图标。
您可以通过设计图标使应用程序更加吸引人,但如果您不想设计它们,则可以下载并使用它们。
有关rcc
命令、.qrc
文件格式以及资源系统的一般信息,请访问Qt资源系统网站。
.qrc
文件#
在运行任何命令之前,将有关资源的信息添加到.qrc
文件中。以下示例中显示了资源在icons.qrc
中的列出方式
</ui>
<!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
代码中的更改#
由于您正在修改现有的示例,您需要修改以下行
from PySide6.QtGui import QIcon, QKeySequence
playIcon = self.style().standardIcon(QStyle.SP_MediaPlay)
previousIcon = self.style().standardIcon(QStyle.SP_MediaSkipBackward)
pauseIcon = self.style().standardIcon(QStyle.SP_MediaPause)
nextIcon = self.style().standardIcon(QStyle.SP_MediaSkipForward)
stopIcon = self.style().standardIcon(QStyle.SP_MediaStop)
并将它们替换为以下内容
from PySide6.QtGui import QIcon, QKeySequence, QPixmap
playIcon = QIcon(QPixmap(":/icons/play.png"))
previousIcon = QIcon(QPixmap(":/icons/previous.png"))
pauseIcon = QIcon(QPixmap(":/icons/pause.png"))
nextIcon = QIcon(QPixmap(":/icons/forward.png"))
stopIcon = QIcon(QPixmap(":/icons/stop.png"))
这将确保使用新的图标而不是应用程序主题提供的默认图标。请注意,这些行不是连续的,而是位于文件的不同的部分。
在所有导入之后,添加以下内容
import rc_icons
现在,您的类的构造函数应如下所示
def __init__(self):
super(MainWindow, self).__init__()
self.playlist = QMediaPlaylist()
self.player = QMediaPlayer()
toolBar = QToolBar()
self.addToolBar(toolBar)
fileMenu = self.menuBar().addMenu("&File")
openAction = QAction(QIcon.fromTheme("document-open"),
"&Open...", self, shortcut=QKeySequence.Open,
triggered=self.open)
fileMenu.addAction(openAction)
exitAction = QAction(QIcon.fromTheme("application-exit"), "E&xit",
self, shortcut="Ctrl+Q", triggered=self.close)
fileMenu.addAction(exitAction)
playMenu = self.menuBar().addMenu("&Play")
playIcon = QIcon(QPixmap(":/icons/play.png"))
self.playAction = toolBar.addAction(playIcon, "Play")
self.playAction.triggered.connect(self.player.play)
playMenu.addAction(self.playAction)
previousIcon = QIcon(QPixmap(":/icons/previous.png"))
self.previousAction = toolBar.addAction(previousIcon, "Previous")
self.previousAction.triggered.connect(self.previousClicked)
playMenu.addAction(self.previousAction)
pauseIcon = QIcon(QPixmap(":/icons/pause.png"))
self.pauseAction = toolBar.addAction(pauseIcon, "Pause")
self.pauseAction.triggered.connect(self.player.pause)
playMenu.addAction(self.pauseAction)
nextIcon = QIcon(QPixmap(":/icons/forward.png"))
self.nextAction = toolBar.addAction(nextIcon, "Next")
self.nextAction.triggered.connect(self.playlist.next)
playMenu.addAction(self.nextAction)
stopIcon = QIcon(QPixmap(":/icons/stop.png"))
self.stopAction = toolBar.addAction(stopIcon, "Stop")
self.stopAction.triggered.connect(self.player.stop)
playMenu.addAction(self.stopAction)
# many lines were omitted
执行示例#
通过调用 python main.py
来运行应用程序以检查新的图标集