PyQt6(没有pyrcc)如何提供资源?

biq*_*les 6 python resources pyqt pyrcc pyqt6

PyQt6 的文档指出

\n
\n

对 Qt\xe2\x80\x99s 资源系统的支持已被删除(即没有pyrcc6)。

\n
\n

鉴于此,应该如何为 PyQt6 应用程序提供资源?

\n

ekh*_*oro 15

更新

\n

从 PyQt-6.3.1 开始,可以再次使用 Qt\xe2\x80\x99s 资源系统。(此版本现在包含生成的 python 资源模块所需的qRegisterResourceData和函数。)qUnregisterResourceData

\n

仍然没有pyrcc6工具,但现在可以使用Qt自己的rcc工具来转换qrc文件。完整的 Qt6 安装时默认会安装此工具,但如果找不到它,也可以使用 PySide6 工具来转换 qrc 文件。(PySide6 只需搜索 Qt6 rcc 工具并使用 运行它subprocess,因此它将产生完全相同的输出)。

\n

因此,要转换 qrc 文件,您现在可以使用:

\n
rcc -g python -o resources.py resources.qrc\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
pyside6-rcc -o resources.py resources.qrc\n
Run Code Online (Sandbox Code Playgroud)\n

但是,需要注意的是,必须修改生成文件顶部的导入行才能与 PyQt6 正常工作:

\n
# Resource object code (Python 3)\n# Created by: object code\n# Created by: The Resource Compiler for Qt version 6.4.0\n# WARNING! All changes made in this file will be lost!\n\n# from PySide6 import QtCore <-- replace this line\nfrom PyQt6 import QtCore\n
Run Code Online (Sandbox Code Playgroud)\n

整个操作可以用这个 unix one-liner 完成(需要GNU sed):

\n
rcc -g python resources.qrc | sed \'0,/PySide6/s//PyQt6/\' > resources.py\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
pyside6-rcc reources.qrc | sed \'0,/PySide6/s//PyQt6/\' > resources.py  \n
Run Code Online (Sandbox Code Playgroud)\n

一旦进行了这个小更改,生成的模块就可以安全地导入到主应用程序中,如下所示:

\n
from PyQt6 import QtCore, QtGui, QtWidgets\nfrom test_ui import Ui_Window\nimport resources\n\nclass Window(QtWidgets.QWidget, Ui_Window):\n    def __init__(self):\n        super().__init__()\n        self.setupUi(self)\n\nif __name__ == \'__main__\':\n\n    app = QtWidgets.QApplication([\'Test\'])\n    window = Window()\n    window.show()\n    app.exec()\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,在不进行上述更改的情况下使用生成的模块是不安全的。这是因为未修改的模块将尝试导入 PySide6,这显然不适合 PyQt6 应用程序。虽然它似乎可以在开发计算机上工作,但不能保证以这种方式混合两个库将始终保持兼容 - 并且在任何情况下,在用户上强制安装 PySide6 都是不好的做法\ 的系统只是为了让他们可以运行 PyQt6 应用程序。

\n
\n

旧答案

\n

共识似乎是应该使用现有的 python 工具而不是 Pyrc。因此,资源将直接存储在文件系统中(可能在存档文件中),然后使用importlib.resources (python >= 3.7) 或pkg_resources或第三方解决方案(如importlib_resources )进行定位。确切地说,这如何映射到pyrcc的现有用途可能是特定于应用程序的,因此需要进行一些实验来找到最佳方法。

\n

有关如何使用这些设施的更多详细信息,请参阅:

\n\n


mus*_*nte 11

当这个问题被发现时,PyQt 邮件列表上已经出现了一些讨论。

维护者不再对维护pyrcc感兴趣,因为他认为考虑到python已经使用多个文件,它不会提供任何重大好处。

最简单的解决方案可能是使用 QDirsetSearchPaths()addSearchPath().

不同之处在于,将使用上述方法所使用的前缀来加载资源。

考虑到之前的情况:

icon = QtGui.QIcon(':/icons/myicon.png')
Run Code Online (Sandbox Code Playgroud)

现在它会变成这样:

# somewhere at the beginning of your program
QtCore.QDir.addSearchPath('icons', 'path_to_icons/')

icon = QtGui.QIcon('icons:myicon.png')
Run Code Online (Sandbox Code Playgroud)