カスタマイズするウィジェットを継承したクラスを作り、カスタマイズ部分を実装してみます。
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と同じになります。