Как можно предоставить ресурсы в PyQt6 (в котором нет pyrcc)?
В документации для PyQt6 указано, что
Поддержка системы ресурсов Qt была удалена (т. Е. Отсутствует
pyrcc6
).
В свете этого, как следует предоставлять ресурсы для приложения PyQt6?
8 ответов
Когда это было обнаружено, в списке рассылки PyQt было некоторое обсуждение .
Сопровождающий больше не заинтересован в поддержке pyrcc, так как считает, что это не дает каких-либо серьезных преимуществ, учитывая, что python в любом случае уже использует несколько файлов.
Самым простым решением, вероятно, является использование статических методов QDir. <tcode id="118926"></tcode> или же <tcode id="118927"></tcode>.
Разница будет в том, что ресурсы будут загружаться с использованием префикса, используемого для описанных выше методов.
Учитывая предыдущую ситуацию:
icon = QtGui.QIcon(':/icons/myicon.png')
Теперь это будет так:
# somewhere at the beginning of your program
QtCore.QDir.addSearchPath('icons', 'path_to_icons/')
icon = QtGui.QIcon('icons:myicon.png')
Похоже, что консенсус состоит в том, что существующие средства python следует использовать вместо pyrrc. Таким образом, ресурсы будут храниться непосредственно в файловой системе (возможно, в архивных файлах), а затем размещаться с помощью importlib.resources (python>= 3.7), pkg_resources или стороннего решения, такого как importlib_resources . То, как это точно соответствует существующему использованию pyrcc, вероятно, будет зависеть от конкретного приложения, поэтому потребуются некоторые эксперименты, чтобы найти лучший подход.
Для получения дополнительных сведений об использовании этих средств см .:
для тех, кто хочет реального и простого решения, просто посмотрите его здесь: ссылка
парень понял это, преобразовав «resource.qrc» в файл .py с помощью pyrcc PySide6. затем импортируйте resource.py (так же, как и раньше) в свой проект PyQt6. все то же самое, включая специальный синтаксис пути к файлу: ":/image.jpg" вместо "./image.jpg"
надеюсь, что это поможет, всегда приятно иметь более простое решение.
Владелец решил, что pyrcc6 бесполезен, и больше не предоставляет его. Однако он не понимает, насколько это полезно для тех из нас, кто использует qt Designer для определения наших ресурсов, таких как значки и т. д., а затем использует pyinstaller для упаковки и поиска всех ресурсов, чтобы pyinstaller мог создать автономный exe, и эти значки правильно встроены и используются в пользовательском интерфейсе .ui.
Вы можете найти эту ссылку полезной (хотя мне это не удалось): https://pypi.org/project/pyqt6rc/
В конце концов, хотя я использую pyqt6, я также установил pyside6 с помощью pip и использовал команду pyside6-rcc, чтобы сделать то же самое, что и старая команда pyrcc5.
Лучшее полное объяснение можно найти по этой ссылке на YouTube:
Мне понравился ответ musicamante, но я не смог применить его напрямую, поскольку использую Qt Designer и pyuic6 для генерации кода Python для пользовательского интерфейса. Однако я нашел обходной путь. Он основан на использовании файла ресурсов в Qt Designer, поскольку я уже делал это с предыдущими версиями PyQt.
- Убедитесь, что путь к ресурсам в файле ресурсов (.qrc) идентичен пути к папке. В этом примере у меня есть значки в папке «значки».
<RCC>
<qresource prefix="/">
<file>icons/myicon.png</file>
</qresource>
</RCC>
- Запустите pyuc6, чтобы сгенерировать код Python.
- Исправьте сгенерированный код Python, заменив путь к ресурсу, например, «:/icons/» на «icons:» во всех строках пути. Я сделал это с помощью sed, например
sed 's/:\/icons\//icons:/g' pyuic6_output_file.py > patched_file.py
- В написанном вручную коде Python определите префикс, используя относительный путь от местоположения файла Python. Это гарантирует, что поиск путей связан с папкой, в которой находится файл Python, а не с текущей рабочей папкой. Это то, что очень важно для работы с pyinstaller.
QtCore.QDir.setSearchPaths("icons", [os.path.join(os.path.dirname(__file__), 'icons')])
- Для pyinstaller используйте опцию add-data, чтобы добавить папку, содержащую ресурсы, например --add-data ".\icons:.\icons". Они не добавляются автоматически pyinstaller.
Добавление дальнейшего видео на YouTube (обновление от 28.12.22) https://www.youtube.com/watch?v=u5BLPTkbaM8
Сделайте это с помощью простого скрипта:
pyuic6 tip.ui > tip.py && sed -i '10iimport _cf_rc\nimport _rc_rc' tip.py
Объяснение здесь:
sed -i "10i' -> means insert from the 10th line onwards.
У меня есть 2 файла для вставки в tip.py:
import _cf_rc
import _rc_rc
Когда я начал использовать PyQt6, я обнаружил, что отсутствует полная поддержка ресурсов Qt6. Особенно при использовании дизайнера и изображений для кнопок, меток и т. д. Я попробовал addSearchPath, но мне все равно пришлось редактировать сгенерированный шаблон .py. После некоторых исследований я нашел использование importlab лучшим решением для моей проблемы.
Я сделал простой скрипт, который использует файл .qrc и генерирует шаблоны .py с помощью пути импорта.
Например изменение:
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/icons/icon1.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
к:
icon = QtGui.QIcon()
with path("myPackage.resources.icons", "icon1.png") as f_path:
icon.addPixmap(QtGui.QPixmap(str(f_path)), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
Вот ссылка на репозиторий GitLab: https://github.com/domarm-comat/pyqt6rc
Или установить через pip:
python3 -m pip install pyqt6rc
Для всех, кто переходит с pyqt5:
Миграция с pyqt5 на pyside6 оказалась для меня проще, чем переход с pyqt5 на pyqt6, поскольку мы получаемpyside6-rcc
иpyside6-uic
Простой способ добавить поддержку Apple Silicon/M1/M2 в устаревшее приложение