別にPySideに限った話ではないですが…
QTではリソースをqrcという形式で扱います。
そしてPython版のPySide・PyQtでは、
- リソースファイルをqrcにまとめる
- その.qrcを.pyコードに変換する
- PySideのコードからリソース読み込み
こういう手順を踏む必要があると分かりました。
意外と複雑で分かりにくかったので、
同じく悩んでる人用に手順を残しておきます。
このページの目次
1.まずQtDesigner上でリソース(.qrc)を生成する
ここでは画像をリソース=qrcに変換します。
まずはQtDesignerのリソースブラウザを開きます。
▼ ここでペンアイコンをクリック
▼ リソースの編集ダイアログが表示される
左下にある新規ファイルアイコン(新しいリソースファイル)をクリックし、適当な名前(ここではapp.qrc)を付けてqrcを新規作成します。
▼ app.qrcを作った
次に右側にある青色フォルダのアイコン(プレフィックスを追加)をクリック、適当な名前でプリフィックスを追加してください。ここではプリフィックスは付けません
▼ プリフィックスは任意
最後に青色フォルダアイコンの横にある [ファイルを追加]ボタンを押し、必要な画像・音声・テキストなどのリソースファイルを追加してください
▼ ここでは画像1つだけ追加した
ひとまずこれでqrcファイルの作成は完了
作業フォルダに app.qrc が生成されたはずです
2.qrcファイルをpyファイルに変換する
お次はqrcファイルをpyファイルに変換
これしないとpythonコードから読み込みできません
変換方法はとっても単純です。
▼ pyside2-rccコマンドを使った変換例
1 |
pyside2-rcc app.qrc -o qrc_app.py |
このツールを使えば.qrcから.pyに変換してくれます。
▼ ちなみに元のqrcファイルはこのような内容
1 2 3 4 5 |
<RCC> <qresource> <file>python.png</file> </qresource> </RCC> |
▼ pyファイルに変換されるとこうなる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from PySide2 import QtCore qt_resource_data = b"\ \x00\x00\x95\xa4\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x0b\xb8\x00\x00\x07\xd0\x08\x03\x00\x00\x00e\xcc\xe2\x08\ \x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\... ... \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000\x17#\ >\xcd\xda\xae\xd5\xbb\xbd\x00\x00\x00\x00IEND\xae\ B`\x82\ " |
バイナリとしてpythonコード上で展開されてます。
PySide・PyQTでは直接qrcファイルは読み込めないです。
※ C++版Qtはよく分からないし不明
3.ウィンドウ表示コードからリソース画像表示
それではリソース画像を読み込み表示してみます。
▼ 次のコードを作ってみた(名前はapp.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import sys from PySide2.QtCore import QSize, Qt from PySide2.QtWidgets import QApplication, QMainWindow from PySide2.QtUiTools import QUiLoader from PySide2.QtWidgets import QApplication from PySide2.QtCore import QFile from PySide2.QtGui import QIcon, QPixmap ## 重要 : リソース読み込み import qrc_app if __name__ == "__main__": app = QApplication(sys.argv) ## 注 : UIファイルは作成済みの前提 ## uiファイルを開く file = QFile("app.ui") file.open(QFile.ReadOnly) ## uiファイルをロードする loader = QUiLoader() window = loader.load(file) ## ボタンにリソース画像設定 pushButton = window.pushButton pixmap = QPixmap(":/python.png") icon = QIcon(pixmap) pushButton.setIcon(icon) #pushButton.setIconSize(pixmap.rect().size()); window.show() sys.exit(app.exec_()) |
▼ リソースから画像表示できた!
ようやくリソースから画像表示成功…
リソースには次の形式でアクセスできます
- :/[プリフィックス]/[ファイル名]
- qrc:/[プリフィックス]/[ファイル名]
今回はプリフィックスなしです。
プリフィックスが必要になるのは用途の違うリソースを区別したい時とか、コードから動的にリソースをまとめて読み込む多い時ですかね(いい具体例が思いつかない)
ひとまずリソースの使い方が分かったので前進
少し面倒だけど手順を覚えれば簡単
ということで qrc ⇒ py の変換手順をまとめます。
- QtDesigner上でリソース(.qrc)を生成
- qrcファイルをpyファイルに変換
- コードからリソース画像などを表示
手順を踏んでいけば難しくはありません。
1PySide開発に役立つ関連記事
最後にPySide開発に役立つ関連記事を紹介します。
▼ ソフト文字列をQTranslatorで翻訳・多言語化
▼ QListWidgetをカスタマイズする方法
▼ ファイルダイアログ起動してパス取得する方法・コード例
https://pisuke-code.com/pyside-qfiledialog-basic-usage/
以上、PySideでのリソース変換手順でした。