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