책에서는 QListWidget을 QComboBox와 비교하고 있다. 저자의 설명은 QComboBox와 유사한 위젯이며 차이가 있다면 스크롤이 가능하다는 점과 다중선택을 예로 들고있다. 뭐든지 연관성을 갖고 접근하면 재미있기 마련인데 저자의 해당 부분 설명은 나름 인상깊었다. QComboBox에서도 선택된 아이템이 변경되면 발생하는 signal과 유사한 signal이 발생된다. item이 바뀌면 currentItemChangedf라는 signal을 통해 QListItem을 보낸다. 또 현재 아이템의 text과 바뀌면 currentTextChanged signal을 통해서 현재의 text 값을 보낸다. 코드를 봐보도로 하자.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
widget = QListWidget()
widget.addItems(["One", "Two", "Three"])
widget.currentItemChanged.connect(self.index_changed)
widget.currentTextChanged.connect(self.text_changed)
self.setCentralWidget(widget)
def index_changed(self, i):
print(i.text())
def text_changed(self, s):
print(s)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
코드를 실행해보게 되면 알 수 있는 부분이지만 설명이 조금 모호한 것 같아 조금 구체적으로 기록을 남겨놓는다.
* Pop quiz - 위 코드를 실행하면 Console 창에 출력되는 값은 어떤 것일까?
정답: One이라고 두 번 표시된다.
현재 선택된 아이템을 기준으로 변경된 QListItem과 변경된 text를 보내게 된다. 즉, 최초로 해당 코드를 실행하게 되면 One, One 이렇게 두번 출력된다. 그리고 One이외의 아이템을 클릭해야 Two, Two 또는 Three, Three로 출력된다.
QLineEdit는 사용자가 입력할 수 있는 single-line text 박스를 의미한다. 바로 코드를 봐보자.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
widget = QLineEdit()
widget.setMaxLength(10)
widget.setPlaceholderText("Enter your text")
widget.returnPressed.connect(self.return_pressed)
widget.selectionChanged.connect(self.selection_changed)
widget.textChanged.connect(self.text_changed)
widget.textEdited.connect(self.text_edited)
self.setCentralWidget(widget)
def return_pressed(self):
print("Return pressed!")
self.centralWidget().setText("Boom!")
def selection_changed(self):
print("Selection changed")
print(self.centralWidget().selectedText())
def text_changed(self, s):
print("Text changed...")
print(s)
def text_edited(self, s):
print("Text edited...")
print(s)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
method 명으로 추측할 수 있는 기능이지만 .setMaxLength()를 이용해서 해당 위젯의 최대 글자수를 제한했으며 QLineEdit 위젯에 "Enter your text"라는 글자출력을 위한 .setPlaceholderText()가 호출되었다. 한 가지 짚고 넘어가야 할 부분은 textChanged와 textEdited signal 부분이다. 해당 코드를 실행하고 input 박스에 글자를 입력하거나 지우게 되면 우리가 설정한 "Text edited"와 "Text changed"가 console창에 출력된다. 하지만 엔터를 입력하게 되면 "Return pressed!"라는 출력과 Boom!이라는 글자가 위젯에 표시되고 Text changed라는 출력값만 볼 수 있다.
즉, 두 가지의 차이는 사용자의 입력 vs 프로그램에 의한 입력이다. 사용자가 입력을 변경하는 경우에만 textEdited signal이 발생하는 점!
또한, QLineEdit에서는 setInputMask라는 함수가 존재한다. 사용자의 오입력을 방지하기 위해서라면 필수적으로 사용해야 할 기능인데 콜론으로 구분된 MAC address형태의 입력만을 받고자 한다면 아래와 프로그래밍 할 수 있다.
widget.setInputMask('>H9:H9:H9:H9:H9:H9;_')
>는 알파벳으로 입력되는 문자를 모두 대문자로 만드는 옵션이다. 그리고 ;_을 통해서 일종의 구분자(delimeter)를 제공한다.
1. Reference book: "Create GUI Applications with Python & Qt5: The hands-on guide to making apps with Python"
2. Reference site: www.ics.com/blog/qt-support-input-masks-and-validators
'<개인공부> - IT > [Python]' 카테고리의 다른 글
Day 7. PyQt5 (Layouts) (0) | 2021.03.19 |
---|---|
Day 6. PyQt5 (QSpinBox, QSlider, QDial) (0) | 2021.03.18 |
Day 4. PyQt5 (QCheckBox, QComboBox) (0) | 2021.03.05 |
Day 3. PyQt5 (QLabel) (0) | 2021.02.09 |
Day 2. PyQt5 (Signal and Slot) (0) | 2021.02.09 |