Qt 资源系统(Qt Resource System)是在应用程序里存储二进制文件的一种机制。
文件可以被嵌入到应用程序中,通过 QFile
类,和使用以 :/
开头的文件名表示的 QIcon
和 QPixmap
类来访问。
Qt 资源系统经常用来存储图片、图标、字体等各种第三方资源。这篇教程里我们将学习怎么载入自己的图片来作为按钮图标。
为了方便学习,我们来尝试修改 Qt 例程里的多媒体播放器。它的界面如下,多媒体的控制(播放、暂停、停止等)是用 QPushButton
组件完成的,使用的都是默认图标。
你可以通过设计图标来让你的程序更有吸引力,但是既然你不想自己设计它们,就是用下面这套图标吧。(这能有吸引力?)
你可以通过 Qt 资源系统(Qt Resource System)网站查询更多 rcc 命令、.qrc 文件格式、资源系统等信息。
.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
运行例程
运行结果如下:
更多关于 Qt for Python 文章,可以查看 PySide6 官方教程 专栏。