2015/04/30

PyQt5を使う (ウィジェットのカスタマイズ)

今回はウィジェットのカスタマイズです。

カスタマイズするウィジェットを継承したクラスを作り、カスタマイズ部分を実装してみます。

QSpinBoxをカスタマイズして、16進数対応します。

import sys

from PyQt5.QtWidgets import QApplication, QSpinBox
from PyQt5.QtGui import QRegExpValidator
from PyQt5.QtCore import QRegExp

class HexSpinBox(QSpinBox):
    def __init__(self, parent=None):
        super(HexSpinBox, self).__init__(parent)
        self.setRange(0, 255)
        self.validator = QRegExpValidator(QRegExp('[0-9A-Fa-f]{1,8}'))

    def validate(self, text, pos):
        return self.validator.validate(text, pos)

    def textFromValue(self, *args, **kwargs):
        return hex(args[0]).upper()[2:]

    def valueFromText(self, *args, **kwargs):
        return int(args[0], 16)

if __name__ == '__main__':
    app = QApplication(sys.argv)

    dialog = HexSpinBox()
    dialog.setRange(0, 65535)
    dialog.setValue(255)
    dialog.show()

    sys.exit(app.exec_())


コンストラクタで、スーパクラス(QSpinBox)のコンストラクタを読んだ後、setRangeメソッドで入力範囲0~255に設定します(10行)
インスタンス変数validatorに入力規制チェックのための正規表現式を設定します(11行)

クラスメソッド validate は、入力チェック時に呼ばれるメソッドです。
引数にチェック対象の文字列が渡されますので、コンストラクタで作成した validator変数を使用して入力値のチェックを行います。

クラスメソッド textFromValueは、表示用文字列変換を行うメソッドで、ウィジェットから呼ばれます。
ここで表示用に数値を16新文字列に変換します。

クラスメソッド valueFromTextは、逆に数値変換を行うメソッドで、同様にウィジェットから呼ばれます。
入力チェック後に呼ばれますので、ここで16進文字列を数値に変換しています。

QSpinBoxを継承しているので、利用方法はQSpinBoxと同じになります。