2016/11/19(土) [n年前の日記]
#1 [python] PySideの「:/images/hoge.jpg」がよく分からない
PySideのサンプルを眺めていたら、QIcon(":/images/hoge.jpg") みたいな記述を見かけた。
何だろうコレ。「:/」は何を表してるんだ?
ググってたら、以下のページに遭遇。
_Qt how to access resources - Stack Overflow
_The Qt Resource System | Qt Core 5.7
リソースとして画像を登録しておくと、「:/images/hoge.jpg」みたいな記述でアクセスできるようになるらしい。
どうやら qrc なるファイルが関係してるようだけど。ググってたら、この日記も検索結果に出てきて。
_2012/09/22の日記 で、PySide じゃなくて PyQt の話だけど、リソースの指定の仕方がメモしてあった。qrcファイルを作成して、ツールを使って 〜_rc.py というファイルに変換して、スクリプト内に import 〜_rc と書いて使うようだなと。
そのあたりググっていたら、どうやら昔はアイコン画像等を表示したい場合、リソースファイルを作ってアレコレしないと表示できなかったようで。
ただ、今現在の Python 2.7.12 + PySide 1.2.4 では、いきなり QIcon("./images/hoge.jpg") と書いても画像が読め込めて、アイコンが表示されてるんだよな…。もしかするとこのあたり、機能追加された、ということだろうか。分からんけど。
何だろうコレ。「:/」は何を表してるんだ?
ググってたら、以下のページに遭遇。
_Qt how to access resources - Stack Overflow
_The Qt Resource System | Qt Core 5.7
リソースとして画像を登録しておくと、「:/images/hoge.jpg」みたいな記述でアクセスできるようになるらしい。
どうやら qrc なるファイルが関係してるようだけど。ググってたら、この日記も検索結果に出てきて。
_2012/09/22の日記 で、PySide じゃなくて PyQt の話だけど、リソースの指定の仕方がメモしてあった。qrcファイルを作成して、ツールを使って 〜_rc.py というファイルに変換して、スクリプト内に import 〜_rc と書いて使うようだなと。
そのあたりググっていたら、どうやら昔はアイコン画像等を表示したい場合、リソースファイルを作ってアレコレしないと表示できなかったようで。
ただ、今現在の Python 2.7.12 + PySide 1.2.4 では、いきなり QIcon("./images/hoge.jpg") と書いても画像が読め込めて、アイコンが表示されてるんだよな…。もしかするとこのあたり、機能追加された、ということだろうか。分からんけど。
◎ QIconについてメモ。 :
数日前までは、QIcon(QPixmap("hoge.png")) とか書かないと生成できないものと思い込んでたけど。
その後あちこちのサンプルを眺めていたら、いきなり QIcon("hoge.png") と書いてもOKなことに気が付いた。とメモ。
_QIcon - PySide v1.0.7 documentation にも、class PySide.QtGui.QIcon(fileName) と書いてあった。見逃してた。
その後あちこちのサンプルを眺めていたら、いきなり QIcon("hoge.png") と書いてもOKなことに気が付いた。とメモ。
_QIcon - PySide v1.0.7 documentation にも、class PySide.QtGui.QIcon(fileName) と書いてあった。見逃してた。
◎ QKeySequence についてメモ。 :
数日前までは、new_action.setShortcut(QKeySequence(QKeySequence.New)) とか書かないと設定できないものと思い込んでたけど。
どうやらいきなり、new_action.setShortcut(QKeySequence.New) と書いてもOKなことに気が付いた。とメモ。
どうやらいきなり、new_action.setShortcut(QKeySequence.New) と書いてもOKなことに気が付いた。とメモ。
[ ツッコむ ]
#2 [python] PySideでカスタムダイアログを作って入力値を取得
お絵かきアプリモドキで、キャンバスの新規作成時、サイズを入力したいなと。ダイアログを開いて、数値を入力させて、みたいな。
何を表示すればいいんだろう。ダイアログを開きたいのだから、QDialog かな。
ググってたら、以下のページに遭遇。
_python - How can I show a PyQt modal dialog and get data out of its controls once its closed? - Stack Overflow
なるほど…。こういう風に書けばいいのか。
こんな感じかな。
_qdialog_test.py
それらしく動いてる、ように見える。
QDialog を使って自作したダイアログの、OK/キャンセルボタンは、以下のように書けば用意できるみたいだなと。 _QDialogButtonBox を使うっぽい。
ダイアログを開く時は、exec_() を呼ぶようで。
前述のスクリプトの中では return (w, h, result == QDialog.Accepted) と書いてるけど、OKボタンが押されたら結果として QDialog.Accepted が返ってくるから、ソレと比較することで True / False に変換して結果を返しているのだろう。呼び出した側は、3番目の返り値が True か False かで、OKが押されたか、キャンセルが押されたかを判別すればいい。
何を表示すればいいんだろう。ダイアログを開きたいのだから、QDialog かな。
ググってたら、以下のページに遭遇。
_python - How can I show a PyQt modal dialog and get data out of its controls once its closed? - Stack Overflow
なるほど…。こういう風に書けばいいのか。
こんな感じかな。
_qdialog_test.py
u""" PySide + QDialogのテスト. カスタムダイアログを表示して入力値を取得する例. 動作確認環境 : Windows10 x64 + Python 2.7.12 + PySide 1.2.4 """ import sys from PySide.QtCore import * # NOQA from PySide.QtGui import * # NOQA class CanvasSizeInputDialog(QDialog): u"""キャンバスサイズ入力ダイアログ.""" DEF_W = 256 DEF_H = 256 def __init__(self, *argv, **keywords): """init.""" super(CanvasSizeInputDialog, self).__init__(*argv, **keywords) self.setWindowTitle("Input new canvas size") # スピンボックスを用意 self.input_w = QSpinBox(self) self.input_h = QSpinBox(self) self.input_w.setRange(1, 8192) # 値の範囲 self.input_h.setRange(1, 8192) self.input_w.setFixedWidth(80) # 表示する横幅を指定 self.input_h.setFixedWidth(80) self.input_w.setValue(CanvasSizeInputDialog.DEF_W) # 初期値を設定 self.input_h.setValue(CanvasSizeInputDialog.DEF_H) # ダイアログのOK/キャンセルボタンを用意 btns = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) btns.accepted.connect(self.accept) btns.rejected.connect(self.reject) # 各ウィジェットをレイアウト gl = QGridLayout() gl.addWidget(QLabel("Input new canvas size", self), 0, 0, 1, 4) gl.addWidget(self.input_w, 1, 0) gl.addWidget(QLabel("x", self), 1, 1) gl.addWidget(self.input_h, 1, 2) gl.addWidget(btns, 2, 3) self.setLayout(gl) def canvas_size(self): u"""キャンバスサイズを取得。(w, h)で返す.""" w = int(self.input_w.value()) h = int(self.input_h.value()) return (w, h) @staticmethod def get_canvas_size(parent=None): u"""ダイアログを開いてキャンバスサイズとOKキャンセルを返す.""" dialog = CanvasSizeInputDialog(parent) result = dialog.exec_() # ダイアログを開く w, h = dialog.canvas_size() # キャンバスサイズを取得 return (w, h, result == QDialog.Accepted) class MyWidget(QWidget): u"""メインウインドウ相当.""" def __init__(self, *argv, **keywords): """init.""" super(MyWidget, self).__init__(*argv, **keywords) self.btn = QPushButton("Open Dialog", self) self.lbl = QLabel("Ready", self) # レイアウト l = QVBoxLayout() l.addWidget(self.btn) l.addWidget(self.lbl) self.setLayout(l) # ボタンを押したらキャンバスサイズ入力ダイアログを開く self.btn.clicked.connect(self.open_input_dialog) def open_input_dialog(self): u"""キャンバスサイズ入力ダイアログを開いて値を取得.""" w, h, result = CanvasSizeInputDialog.get_canvas_size(self) if result: self.lbl.setText("Ok. %d x %d" % (w, h)) else: self.lbl.setText("Cancel.") if __name__ == '__main__': app = QApplication(sys.argv) w = MyWidget() w.show() sys.exit(app.exec_())
それらしく動いてる、ように見える。
QDialog を使って自作したダイアログの、OK/キャンセルボタンは、以下のように書けば用意できるみたいだなと。 _QDialogButtonBox を使うっぽい。
# ダイアログのOK/キャンセルボタンを用意 btns = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) btns.accepted.connect(self.accept) btns.rejected.connect(self.reject)accepted とか rejected とか、そのあたりがOKだのキャンセルだのと関係してるのだろうなと。
ダイアログを開く時は、exec_() を呼ぶようで。
dialog = CanvasSizeInputDialog(parent) result = dialog.exec_() # ダイアログを開くOK/キャンセルボタンを用意した場合は、結果として、QDialog.Accepted か QDialog.Rejected が返ってくる模様。 _QDialog - PySide v1.0.7 documentation に、それらしいシンボルも見えるし。
前述のスクリプトの中では return (w, h, result == QDialog.Accepted) と書いてるけど、OKボタンが押されたら結果として QDialog.Accepted が返ってくるから、ソレと比較することで True / False に変換して結果を返しているのだろう。呼び出した側は、3番目の返り値が True か False かで、OKが押されたか、キャンセルが押されたかを判別すればいい。
[ ツッコむ ]
#3 [prog] Open Icon Libraryってどうなってるんだろ
_Open Icon Library
なる、CC0、Public Domain、GPLのアイコンを大量に集めたソレを見つけたのだけど。
ライセンスがCC0のアイコンのみをまとめたのかなと思われる、open_icon_library-CC-0.11.tar.bz2 をダウンロードして中身を確認してみたら、 _Oxygen Icon が混ざっていて。例えば draw-freehand.svg のあたりとか。コレ、ライセンスが LGPL だと思うのだけど…。CC0じゃないんだけど…。
もしかすると、他にも違うライセンスのアイコンが混ざってそう。怪しいから使わないことにして、HDDから全部削除した。
Open Icon Library って、そのあたりの分類はどうなってるんだろう…。まあ、2010年から更新されてないようだし、おそらく放置状態なのだろうけど。
ライセンスがCC0のアイコンのみをまとめたのかなと思われる、open_icon_library-CC-0.11.tar.bz2 をダウンロードして中身を確認してみたら、 _Oxygen Icon が混ざっていて。例えば draw-freehand.svg のあたりとか。コレ、ライセンスが LGPL だと思うのだけど…。CC0じゃないんだけど…。
もしかすると、他にも違うライセンスのアイコンが混ざってそう。怪しいから使わないことにして、HDDから全部削除した。
Open Icon Library って、そのあたりの分類はどうなってるんだろう…。まあ、2010年から更新されてないようだし、おそらく放置状態なのだろうけど。
[ ツッコむ ]
以上、1 日分です。