fereria
6/21/2020 - 1:18 PM

pyside Validation

# -*- coding: utf-8 -*-

import sys
import re

from PySide2.QtWidgets import (QApplication,
                               QDialog,
                               QMainWindow,
                               QStatusBar,
                               QProgressBar,
                               QSizePolicy,
                               QPushButton,
                               QLineEdit,
                               QVBoxLayout)

from PySide2.QtCore import (Qt)
from PySide2.QtGui import (QValidator)


class UISample(QDialog):

    def __init__(self, parent=None):

        super().__init__(parent)

        self.edit = QLineEdit()
        validator = SampleValidator(self.edit)
        self.edit.setValidator(validator)
        layout = QVBoxLayout()
        layout.addWidget(self.edit)
        self.setLayout(layout)


class ValidateEdit(QLineEdit):

    def __init__(self, parent=None):
        super().__init__(parent)

        # 電話番号を入れられるようにしてみる
        # ###-####-####
        validate = SampleValidator(self)
        self.setValidator(validate)


class SampleValidator(QValidator):

    def __init__(self, parent=None):
        super().__init__()
        self.edit = parent

    def fixup(self, input):

        self.edit.setText(input[:-1] + "-" + input[-1])

    def validate(self, input, pos):
        # 入力の文字列が正しいかを判定する

        # 空OK
        if pos == 0:
            return QValidator.Acceptable

        if pos in [4, 9]:
            if input[pos - 1] == "-":
                return QValidator.Acceptable
            self.fixup(input)
            return (QValidator.Invalid, input, pos)

        # 電話番号入れ終わったら、以降は入力させない
        if pos > 13:
            return QValidator.Invalid

        # 数字限定
        if re.search("[0-9]", input) is None:
            return QValidator.Invalid

        return QValidator.Acceptable


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

    a = UISample()
    a.show()
    sys.exit(app.exec_())