프로그래밍 관련/PyQt

PyQt QLineEdit 키보드 입력값 받기. 입력값 제한하기 (숫자만 넣기,문자만 넣기 등등)

존버매니아.임베디드 개발자 2021. 12. 4. 14:33
반응형
  • 개요
  • Text Edit 활성화/비활성화/읽기전용 셋팅 관련 메소드들
  • 입력 제한 하기
  • QLineEdit 관련 이벤트 처리하기(텍스트 변경시 이벤트 발생 등등)

개요

마우스 클릭하면 커서 깜박 거리면서 키보드로 데이터 입력할 수 있는 창

그것을 QLineEidt라고 한다.

 

setText(str) 메소드를 사용해서 text edit에 내용을 유저가 임의로 지정할 수도 있다.

text() 메소드를 사용하면 현재 textedit에 입력된 문자열을 출력하고

import sys
from PyQt5.QtWidgets import *
   
    
class MyWindow(QMainWindow):
         
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test")
        self.setGeometry(1000, 200, 300, 300)

        self.textedit1 = QLineEdit(self)
        self.textedit1.setText("텍스트 적어놓기")
        print(self.textedit1.text())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()

    app.exec_()

Text Edit 활성화/비활성화/읽기전용 셋팅 관련 메소드들

self.textedit.setReadOnly(True)
self.textedit.setDisabled(True)
self.textedit.setEnabled(True)

입력 제한 하기

데이터 입력을 하긴 하는데 예를 들어 숫자만 입력받는다던지, 특정문자만 받는다던지 등등 입력값에 제한을 두는 기능을 제공한다.

pyqt number only

pyqt character only

pyqt keyboard input limit

 

def setValidator(self, a0: QtGui.QValidator) -> None: ...

메소드를 사용하여 입력을 제한할 수 있다.

이 때 메소드의 파라미터 자리에 들어가는 클래스는

class QIntValidator(QValidator):
class QDoubleValidator(QValidator):
class QRegExpValidator(QValidator):

위와 같은 3가지 종류가 있는데, 이름을 보면 감을 잡을 수 있는데

첫번째 클래스는 정수와 관련된 제한을 걸어주고

두번째 클래스는 실수와 관련된 제한을 걸어주고

세번째 클래스는 정규표현식 관련 제한을 걸어준다.

 

  • 입력을 정수로 제한
self.textedit1 = QLineEdit(self)
self.textedit1.setValidator(QIntValidator(self)) # 정수만 입력된다.
self.textedit1.setValidator(QIntValidator(1,100,self))  # 1 ~ 100 사이의 정수 입력

근데 위에 범위지정하는 메소드 관련해서 유의할 것이 있는데,

메소드 형태만 보면 이렇게 생각 할 것이다.

첫번째의 경우 1 ~ 100 까지로 했으니까

textEdit에서 내가 101, 200, 300, 1000 이런 숫자를 입력 못한다고 생각할 수 있다.

근데 실제 동작은 그렇지가 않다.

 

키보드 입력 제한은 1~100 이라는 숫자보다는 자릿수만 연관된다.

무슨 말이냐면 1 ~ 100 으로 제한하면 최대 3자리 까지 입력가능

5~752 으로 제한해도 최대 3자리 까지 입력가능 ( 752이든 100이든 값은 상관없고 자릿수 3자리니까)

0~34  으로 제한하면 최대 2자리 까지 입력가능 ..

 

버그인건지 뭔지는 모르겠다.

 

근데 이상하게 음수에 대해서는 범위제한한 대로 실제 키보드 입력도 제한이 된다. 

 

  • 입력을 실수로 제한
self.textedit1 = QLineEdit(self)
self.textedit1.setValidator(QDoubleValidator(self)) # 실수형 데이터만 입력가능
self.textedit1.setValidator(QDoubleValidator(1,100,3,self)) # 1 ~ 100사이 실수, 소수점 아래 3자리까지만

이번에는 실수형에 대한 메소드다.

근데 이것도 마찬가지로,

범위 지정할 때 소수점아래 자릿수는 잘 제한이 되는데

앞에 정수부분은 자릿수 제한이 전혀 안되더라.

그리고 이건 앞에 정수형이랑 다르게 음수로 해도 마찬가지다.

 

  • 정규표현식으로 제한
self.textedit = QLineEdit()
re = QtCore.QRegExp("[0-9a-fA-F]*")
self.textedit.setValidator(QtGui.QRegExpValidator(re))

위 예시의 경우

0~9 까지의 숫자 & 소문자 a ~ f 알파멧 & 대문자 A~F 알파벳만 키보드 입력이가능하다.

(16진수 hex 값으로 제한하는 예시를 들어봤음)

 

정규표현식을 사용해서

"[0-9a-fA-F]*" <- 이 부분을 적절하게 수정해서 사용하면 된다.

정규표현식 관련 설명은 다른 글을 참조

 

2021.09.27 - [프로그래밍 관련/파이썬] - 파이썬 . 정규표현식.정규식. re 라이브러리

2021.09.27 - [프로그래밍 관련/파이썬] - 파이썬 . 정규표현식.정규식. re 라이브러리 -메타문자들

2021.10.23 - [프로그래밍 관련/파이썬] - 파이썬 정규식 예시들


QLineEdit 관련 이벤트 처리하기(텍스트 변경시 이벤트 발생 등등)

 

textChanged Text edit에 글자 하나라도 바뀌면 발생 (키보드 키 입력 하나 할 때마다 발생한다는 얘기임)
editingFinished
유저가 엔터를 누르거나, 혹은 마우스 다른데 클릭해서 커서 사라질 때
returnPressed 텍스트 에디터에 글자 다치고 유저가 엔터 눌렀을 때
import sys
from PyQt5.QtWidgets import *
   
    
class MyWindow(QMainWindow):
         
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Test")
        self.setGeometry(1000, 200, 300, 300)

        te = QLineEdit(self)
        te.textChanged.connect(self.fun_te_changed)
        te.editingFinished.connect(self.fun_te_editfinished)
        te.returnPressed.connect(self.fun_te_returnPressed)
       
    def fun_te_changed(self):
        print("event 발생")

    def fun_te_editfinished(self):
        print("edit finish event 발생")
        
    def fun_te_returnPressed(self):
        print("return press event 발생")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()

    app.exec_()
반응형