ekh*_*oro 15
更新:
\n从 PyQt-6.3.1 开始,可以再次使用 Qt\xe2\x80\x99s 资源系统。(此版本现在包含生成的 python 资源模块所需的qRegisterResourceData和函数。)qUnregisterResourceData
仍然没有pyrcc6工具,但现在可以使用Qt自己的rcc工具来转换qrc文件。完整的 Qt6 安装时默认会安装此工具,但如果找不到它,也可以使用 PySide6 工具来转换 qrc 文件。(PySide6 只需搜索 Qt6 rcc 工具并使用 运行它subprocess,因此它将产生完全相同的输出)。
因此,要转换 qrc 文件,您现在可以使用:
\nrcc -g python -o resources.py resources.qrc\nRun Code Online (Sandbox Code Playgroud)\n或者:
\npyside6-rcc -o resources.py resources.qrc\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n整个操作可以用这个 unix one-liner 完成(需要GNU sed):
\nrcc -g python resources.qrc | sed \'0,/PySide6/s//PyQt6/\' > resources.py\nRun Code Online (Sandbox Code Playgroud)\n或者:
\npyside6-rcc reources.qrc | sed \'0,/PySide6/s//PyQt6/\' > resources.py \nRun Code Online (Sandbox Code Playgroud)\n一旦进行了这个小更改,生成的模块就可以安全地导入到主应用程序中,如下所示:
\nfrom 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()\nRun Code Online (Sandbox Code Playgroud)\n请注意,在不进行上述更改的情况下使用生成的模块是不安全的。这是因为未修改的模块将尝试导入 PySide6,这显然不适合 PyQt6 应用程序。虽然它似乎可以在开发计算机上工作,但不能保证以这种方式混合两个库将始终保持兼容 - 并且在任何情况下,在用户上强制安装 PySide6 都是不好的做法\ 的系统只是为了让他们可以运行 PyQt6 应用程序。
\n旧答案:
\n共识似乎是应该使用现有的 python 工具而不是 Pyrc。因此,资源将直接存储在文件系统中(可能在存档文件中),然后使用importlib.resources (python >= 3.7) 或pkg_resources或第三方解决方案(如importlib_resources )进行定位。确切地说,这如何映射到pyrcc的现有用途可能是特定于应用程序的,因此需要进行一些实验来找到最佳方法。
\n有关如何使用这些设施的更多详细信息,请参阅:
\n\nmus*_*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)
| 归档时间: |
|
| 查看次数: |
9556 次 |
| 最近记录: |