Как можно предоставить ресурсы в 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:

https://www.youtube.com/watch?v=u5BLPTkbaM8

Мне понравился ответ musicamante, но я не смог применить его напрямую, поскольку использую Qt Designer и pyuic6 для генерации кода Python для пользовательского интерфейса. Однако я нашел обходной путь. Он основан на использовании файла ресурсов в Qt Designer, поскольку я уже делал это с предыдущими версиями PyQt.

  1. Убедитесь, что путь к ресурсам в файле ресурсов (.qrc) идентичен пути к папке. В этом примере у меня есть значки в папке «значки».
          <RCC>
      <qresource prefix="/">
        <file>icons/myicon.png</file>
      </qresource>
    </RCC>
  1. Запустите pyuc6, чтобы сгенерировать код Python.
  2. Исправьте сгенерированный код Python, заменив путь к ресурсу, например, «:/icons/» на «icons:» во всех строках пути. Я сделал это с помощью sed, например
          sed 's/:\/icons\//icons:/g' pyuic6_output_file.py > patched_file.py
  1. В написанном вручную коде Python определите префикс, используя относительный путь от местоположения файла Python. Это гарантирует, что поиск путей связан с папкой, в которой находится файл Python, а не с текущей рабочей папкой. Это то, что очень важно для работы с pyinstaller.
          QtCore.QDir.setSearchPaths("icons", [os.path.join(os.path.dirname(__file__), 'icons')])
  1. Для 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 в устаревшее приложение

Другие вопросы по тегам