안녕하세요! 이번 포스트에서는 PyQt를 활용하여 QCompleter를 이용한 기본 자동완성 기능 구현하는 방법에 대해 알아보겠습니다. 자동완성 기능은 사용자 경험을 향상시키는 유용한 도구로, 사용자가 입력하는 정보를 바탕으로 가능한 옵션을 제시하는 방식으로 작동합니다. 특히 폼, 검색창, 텍스트 입력 필드에서 자주 사용됩니다.
1. PyQt 라이브러리 소개
PyQt는 Python에서 Qt 애플리케이션을 개발할 수 있도록 지원하는 라이브러리입니다. Qt는 C++로 작성된 크로스 플랫폼 애플리케이션 개발 프레임워크로, 다양한 UI 구성 요소를 지원합니다. PyQt는 이러한 구성 요소를 Python에서 사용할 수 있도록 래핑한 라이브러리입니다. PyQt를 사용하면 사용자 인터페이스(UI)를 쉽게 개발할 수 있으며, 다양한 기능을 제공하여 효율적인 애플리케이션 개발을 가능하게 합니다.
2. QCompleter란?
QCompleter는 PyQt의 클래스 중 하나로, 사용자가 입력하는 동안 자동으로 제안된 옵션을 표시해 주는 기능을 제공합니다. 이는 주로 QLineEdit와 함께 사용되어 입력된 텍스트를 바탕으로 후보를 제시하는 방식으로 움직입니다. QCompleter를 적절히 사용하면 사용자 입력을 더 쉽게 처리할 수 있으며, 이로 인해 사용자 경험을 개선할 수 있습니다.
3. 자동완성 기능 구현하기
이제 QCompleter를 사용하여 자동완성 기능을 구현해보겠습니다. 간단한 예제 프로그램을 만들어 QLineEdit 위젯에 사용자 입력에 따른 자동완성 후보 목록을 표시하는 방식을 살펴보겠습니다.
3.1 예제 코드
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QLabel, QCompleter
from PyQt5.QtCore import QStringListModel
class AutoCompleteExample(QWidget):
def __init__(self):
super().__init__()
# 기본 윈도우 설정
self.setWindowTitle('QCompleter 예제')
self.setGeometry(100, 100, 400, 200)
# 레이아웃 설정
layout = QVBoxLayout()
# 라벨 추가
self.label = QLabel('자동완성 예제: 아래 입력창에 입력해보세요:')
layout.addWidget(self.label)
# QLineEdit 추가
self.line_edit = QLineEdit(self)
layout.addWidget(self.line_edit)
# 후보 리스트 생성
self.suggestions = ['Python', 'PyQt', 'QCompleter', 'Qt', 'GUI', '자동완성', '개발', '예제']
self.completer = QCompleter(self.suggestions, self)
# QLineEdit과 QCompleter 연결
self.line_edit.setCompleter(self.completer)
# 레이아웃 적용
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = AutoCompleteExample()
window.show()
sys.exit(app.exec_())
위의 코드는 PyQt를 이용한 기본적인 자동완성 기능을 포함하고 있습니다. 코드를 분석해 보겠습니다.
3.2 코드 설명
- QApplication: PyQt 애플리케이션을 생성할 때 필요한 객체입니다. 모든 PyQt 애플리케이션은 하나의 QApplication 인스턴스를 포함해야 합니다.
- QWidget: 모든 UI 요소의 기본 클래스입니다. QWidget을 상속하여 구체적인 애플리케이션의 UI를 구성합니다.
- QVBoxLayout: Vertical Box Layout으로, 위젯을 수직으로 배치하는 레이아웃입니다.
- QLineEdit: 단일 줄 텍스트 입력 필드입니다. 사용자로부터 입력을 받을 수 있는 위젯입니다.
- QLabel: 텍스트를 표시할 수 있는 위젯입니다. 사용자에게 정보를 제공하는 데 사용됩니다.
- QCompleter: 자동완성 기능을 제공하는 클래스입니다. 후보 리스트를 제공하여 사용자가 입력하는 동안 제안된 내용을 보여줍니다.
- QStringListModel: QStringList에 대한 데이터 모델입니다. QCompleter와 함께 사용하여 제안된 후보 목록을 관리합니다.
코드에서 ‘./QCompleter’를 사용하여 자동완성 후보를 구성하는 문자열 리스트를 제공합니다. 이 리스트는 코드 상단에서 미리 정의하고, QCompleter에 연결됩니다. 사용자가 QLineEdit에 입력을 시작하면, QCompleter는 제공된 후보 리스트를 참고하여 입력 내용에 맞는 옵션을 자동으로 제시하게 됩니다.
4. 동적 자동완성 예제
보다 복잡한 예제에서는 후보 리스트를 입력에 따라 동적으로 변경해 보겠습니다. 사용자가 입력할 때마다 자동완성 후보가 바뀌도록 구현해 보겠습니다. 이를 위해 QCompleter와 QLineEdit의 텍스트 변경 이벤트를 활용하겠습니다.
4.1 코드 수정
class DynamicAutoCompleteExample(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('동적 QCompleter 예제')
self.setGeometry(100, 100, 400, 200)
layout = QVBoxLayout()
self.label = QLabel('자동완성 예제: 아래 입력창에 입력해보세요:')
layout.addWidget(self.label)
self.line_edit = QLineEdit(self)
layout.addWidget(self.line_edit)
self.suggestions = ['Python', 'PyQt', 'QCompleter', 'Qt', 'GUI', '자동완성', '개발', '예제']
self.completer = QCompleter(self.suggestions, self)
# QLineEdit과 QCompleter 연결
self.line_edit.setCompleter(self.completer)
# 텍스트 변경 이벤트 연결
self.line_edit.textChanged.connect(self.update_completer)
self.setLayout(layout)
def update_completer(self, text):
# 입력한 텍스트를 기준으로 후보 필터링
filtered_suggestions = [s for s in self.suggestions if s.lower().startswith(text.lower())]
self.completer.model().setStringList(filtered_suggestions)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DynamicAutoCompleteExample()
window.show()
sys.exit(app.exec_())
위 코드는 사용자가 QLineEdit에 입력할 때마다 자동완성 후보가 업데이트되는 예제입니다. update_completer
메서드는 사용자가 입력하는 텍스트에 따라 자동완성 후보 리스트를 동적으로 필터링합니다.
4.2 코드 설명
- textChanged 이벤트: 사용자가 QLineEdit에 입력할 때마다 발생하는 이벤트입니다. 이 이벤트를 통해 사용자가 입력하는 내용을 확인하고 자동완성 후보 리스트를 필터링하는 함수를 호출합니다.
- update_completer 메서드: 사용자가 입력하는 텍스트를 기반으로 후보 리스트를 업데이트하는 역할을 합니다. 기존 후보 리스트에서 입력한 텍스트로 시작하는 항목만 남기고 필터링합니다.
5. 다국어 지원을 위한 자동완성 구현
PyQt를 이용하면 다국어를 지원하는 애플리케이션을 쉽게 개발할 수 있습니다. 텍스트 입력 언어에 따라 다른 후보 리스트를 제공하는 방식으로 자동완성을 구현해 보겠습니다.
5.1 다국어 지원 예제 코드
class MultiLangAutoComplete(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('다국어 QCompleter 예제')
self.setGeometry(100, 100, 400, 200)
layout = QVBoxLayout()
self.label = QLabel('자동완성 예제: 아래 입력창에 입력해보세요:')
layout.addWidget(self.label)
self.line_edit = QLineEdit(self)
layout.addWidget(self.line_edit)
# 다국어 후보 리스트
self.suggestions = {
'en': ['apple', 'banana', 'grape', 'orange', 'pear'],
'ko': ['사과', '바나나', '포도', '오렌지', '배'],
'es': ['manzana', 'plátano', 'uva', 'naranja', 'pera']
}
self.current_language = 'en' # 기본 언어 설정
self.completer = QCompleter(self.suggestions[self.current_language], self)
self.line_edit.setCompleter(self.completer)
self.line_edit.textChanged.connect(self.update_completer)
self.setLayout(layout)
def update_completer(self, text):
filtered_suggestions = [s for s in self.suggestions[self.current_language] if s.lower().startswith(text.lower())]
self.completer.model().setStringList(filtered_suggestions)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MultiLangAutoComplete()
window.show()
sys.exit(app.exec_())
위의 예제에서는 다국어 지원을 위해 후보 리스트를 사전 형태로 구성하였고, 기본 언어를 영어(en)로 설정하였습니다. 이 예제를 기반으로 사용자가 언어를 선택할 수 있도록 기능을 추가할 수 있습니다.
5.2 다국어 변화 예시 설명
- 자동완성 후보 리스트를 다국어로 준비하여 사용자가 선택할 수 있도록 셋팅합니다.
- 선택된 언어에 따라 모델이 변동하도록 업데이트합니다.
- code 간단히 다국어 변환 처리를 추가할 수 있습니다.
6. 결론
이번 포스트에서는 PyQt의 QCompleter를 구현하여 간단한 자동완성 기능을 만드는 법을 배웠습니다. 기본 원리를 이해하고, 이를 커스터마이징하여 다양한 형태의 자동완성 기능을 개발할 수 있습니다. 또한, 다국어 지원이나 동적 후보 변화를 추가함으로써 사용자에게 보다 나은 경험을 제공할 수 있습니다.
PyQt의 다양한 기능을 활용하여 만족스러운 사용자 경험을 만드는 애플리케이션을 개발해 보시기 바랍니다. 궁금한 점이나 피드백이 있으시면 댓글로 남겨주세요. 다음 포스트에서 또 만나길 기대합니다!