본문 바로가기
코딩취미/Python

에디터박스(QEdit)에서 최소값, 최대값 유효성 체크와 값 입력받기

by 브링블링 2024. 7. 19.
반응형

에디터박스에서 최소값, 최대값 유효성 체크와 값 입력받기

사용자 인터페이스 설계에서 데이터 입력의 정확성과 유효성을 보장하는 것은 매우 중요합니다. 특히, 특정 범위 내에서만 유효한 값을 받아야 하는 경우, 이를 구현하는 방법에 대한 이해가 필요합니다. 또한 유효한 값을 처리하는 타이밍(시점)도 중요합니다. 이번 글에서는 PyQt5를 사용하여 QLineEdit 위젯에 최소값과 최대값을 확인하고, 해당값을 처리하는 타이밍에 대해서 정리합니다.

 

입력범위에 따라서 실시간처리와 포커스 처리로 데이터를 처리해야할 수 있습니다. 입력범위가 (2~16)일 때, 실시간 처리는 원하는 동작을 못하게 됩니다. 16을 입력하려고 1을 입력하면 최소값 기준과 충돌해서 입력을 거부하게 되기때문입니다.

 따라서 이렇게 범위가 최소값과 충돌이 될 때는 입력을 완전히 마친후에 확인하는 방법을 선택합니다. 이런 방식으로 구성하면 최대값 16을 입력할 수 있고, 또한 최소값과 최대값을 벗어날 경우에도 대응을 할 수 있습니다.

 

1. 텍스트가 변경될 때 처리 (실시간 처리)

특징:

  • 사용자가 입력하는 동안 실시간으로 텍스트 변경 사항을 처리합니다.
  • 입력 내용에 대한 즉각적인 피드백을 제공할 수 있습니다.
  • 입력 중에 지속적으로 이벤트가 발생하므로, 성능에 민감한 작업에서는 주의가 필요합니다.

사용 사례:

  • 자동 완성 기능.
  • 실시간 검색.
  • 입력 유효성 검사 및 경고 메시지 즉시 표시.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QVBoxLayout, QWidget, QLabel
from PyQt5.QtGui import QIntValidator

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Real-time Text Change Example')
        self.setGeometry(100, 100, 300, 200)

        main_widget = QWidget()
        self.setCentralWidget(main_widget)

        layout = QVBoxLayout()

        self.label = QLabel('Enter a number between 1 and 100:')
        self.line_edit = QLineEdit()
        self.line_edit.setValidator(QIntValidator(1, 100))
        self.line_edit.textChanged.connect(self.on_text_changed)

        self.feedback_label = QLabel('')

        layout.addWidget(self.label)
        layout.addWidget(self.line_edit)
        layout.addWidget(self.feedback_label)

        main_widget.setLayout(layout)

    def on_text_changed(self, text):
        if text:
            value = int(text)
            if 1 <= value <= 100:
                self.feedback_label.setText(f'The value {value} is valid.')
            else:
                self.feedback_label.setText(f'The value {value} is out of range.')
        else:
            self.feedback_label.setText('')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())
반응형

2. 텍스트 입력이 끝났을 때 처리 (포커스 잃음 처리)

특징:

  • 사용자가 입력을 완료하고 QLineEdit 위젯이 포커스를 잃을 때만 입력을 처리합니다.
  • 실시간 피드백이 필요하지 않은 경우에 유용합니다.
  • 입력이 완료된 후에만 이벤트가 발생하므로, 성능에 영향을 덜 미칩니다.

사용 사례:

  • 입력 데이터의 최종 유효성 검사.
  • 데이터베이스 업데이트.
  • 입력 완료 후의 복잡한 처리 작업.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QVBoxLayout, QWidget, QLabel, QMessageBox
from PyQt5.QtGui import QIntValidator

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Text Finished Example')
        self.setGeometry(100, 100, 300, 200)

        main_widget = QWidget()
        self.setCentralWidget(main_widget)

        layout = QVBoxLayout()

        self.label = QLabel('Enter a number between 1 and 100:')
        self.line_edit = QLineEdit()
        self.line_edit.setValidator(QIntValidator(1, 100))
        self.line_edit.editingFinished.connect(self.on_editing_finished)

        layout.addWidget(self.label)
        layout.addWidget(self.line_edit)

        main_widget.setLayout(layout)

    def on_editing_finished(self):
        text = self.line_edit.text()
        if text:
            value = int(text)
            if 1 <= value <= 100:
                QMessageBox.information(self, 'Success', f'The value {value} is valid.')
            else:
                QMessageBox.warning(self, 'Error', f'The value {value} is out of range.')
        else:
            QMessageBox.warning(self, 'Error', 'No value entered.')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

 

3. QIntValidator 생성자

QIntValidator는 PyQt5에서 입력된 값이 정수인지 확인하고 지정된 범위 내에 있는지 검사하는 데 사용되는 유효성 검사기입니다. QIntValidator의 validate 메서드는 입력된 값에 따라 세 가지 상태를 반환합니다

QIntValidator(int bottom, int top, parent=None)

QIntValidator의 validate 메서드

validate 메서드는 세 가지 상태를 반환합니다:

  1. QValidator.Acceptable:
    • 입력된 값이 유효하고 지정된 범위 내에 있습니다.
    • QLineEdit은 입력된 값을 허용하고, 텍스트를 정상적으로 표시합니다.
  2. QValidator.Intermediate:
    • 입력된 값이 부분적으로 유효합니다. 예를 들어, 값이 범위 내에 있지 않지만, 입력을 계속하면 유효한 값이 될 수 있습니다.
    • QLineEdit은 입력된 값을 허용하지만, 유효성을 강조하기 위해 스타일을 변경할 수 있습니다 (예: 빨간색 배경).
  3. QValidator.Invalid:
    • 입력된 값이 유효하지 않으며, 지정된 범위 내에 있지 않습니다.
    • QLineEdit은 입력된 값을 거부합니다. 잘못된 값을 입력하면 텍스트 필드에 반영되지 않습니다.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QVBoxLayout, QWidget, QLabel, QFormLayout
from PyQt5.QtGui import QIntValidator
from PyQt5.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QIntValidator Example')
        self.setGeometry(100, 100, 300, 200)

        main_widget = QWidget()
        self.setCentralWidget(main_widget)

        layout = QFormLayout()

        self.label = QLabel('Enter a number between 1 and 100:')
        self.line_edit = QLineEdit()
        validator = QIntValidator(1, 100, self)
        self.line_edit.setValidator(validator)
        self.line_edit.textChanged.connect(self.on_text_changed)

        layout.addRow(self.label, self.line_edit)
        main_widget.setLayout(layout)

    def on_text_changed(self, text):
        validator = self.line_edit.validator()
        state, _, _ = validator.validate(text, 0)
        if state == QValidator.Acceptable:
            self.line_edit.setStyleSheet("background-color: lightgreen;")
        elif state == QValidator.Intermediate:
            self.line_edit.setStyleSheet("background-color: yellow;")
        else:
            self.line_edit.setStyleSheet("background-color: lightcoral;")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

 

주요 메서드

1. setRange 메서드:

  • 설명: 유효한 정수 범위를 설정합니다.
    • bottom: 정수 범위의 하한 값.
    • top: 정수 범위의 상한 값.
    • 리턴값: 없음.
setRange(int bottom, int top)

 

2. validate 메서드:

  • 설명: 문자열이 유효한 정수인지, 그리고 지정된 범위 내에 있는지 확인합니다. 이 메서드는 QValidator 클래스로부터 상속됩니다.
    • input: 검사할 문자열.
    • pos: 문자열에서 현재 위치.
    • 리턴값: 튜플 (state, input, pos)
      • state: QValidator.Acceptable, QValidator.Intermediate, QValidator.Invalid 중 하나로 반환되며, 문자열의 유효성 상태를 나타냅니다.
      • input: 검증된 문자열.
      • pos: 문자열에서 현재 위치.
반응형