mieki256's diary



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") と書いても画像が読め込めて、アイコンが表示されてるんだよな…。もしかするとこのあたり、機能追加された、ということだろうか。分からんけど。

QIconについてメモ。 :

数日前までは、QIcon(QPixmap("hoge.png")) とか書かないと生成できないものと思い込んでたけど。

その後あちこちのサンプルを眺めていたら、いきなり 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なことに気が付いた。とメモ。

#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
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_test_ss01.gif

それらしく動いてる、ように見える。

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年から更新されてないようだし、おそらく放置状態なのだろうけど。

以上、1 日分です。

過去ログ表示

Prev - 2016/11 - Next
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

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project