PyQt개발강좌, 커스텀 자동완성 데이터 소스 설정

본 글에서는 PyQt를 이용하여 커스텀 자동완성 기능을 구현하는 방법에 대해 설명합니다. 자동완성 기능은 사용자 입력에 기반하여 추천 옵션을 제공함으로써 사용자 경험을 개선하는 데 큰 역할을 합니다. PyQt의 강력한 GUI 구성 요소를 활용하여 이 기능을 어떻게 효과적으로 구현할 수 있는지 알아보겠습니다.

1. PyQt 소개

PyQt는 Python 프로그래밍 언어를 위한 Qt 애플리케이션 프레임워크의 파이썬 바인딩입니다. 이는 다중 플랫폼 환경에서 GUI 애플리케이션을 개발할 수 있도록 다양한 위젯과 도구를 제공합니다. PyQt를 사용하면 자연스러운 시각적 인터페이스와 사용자 맞춤형 기능을 갖춘 애플리케이션을 쉽게 구축할 수 있습니다.

2. 자동완성 기능의 중요성

자동완성은 많은 현대 애플리케이션에서 필수 요소가 되었습니다. 이를 통해 사용자는 입력한 내용에 대한 힌트를 얻고 더 빠르고 정확하게 데이터를 입력할 수 있습니다. 특히 긴 문자열이나 복잡한 목록을 다룰 때 매우 유용합니다.

3. PyQt에서 자동완성 기능 구현하기

자동완성 기능을 구현하기 위해서는 QLineEdit 위젯과 QCompleter 클래스를 사용할 수 있습니다. QCompleter는 자동완성 제안을 관리하고 표시하는 역할을 합니다. 이제 커스텀 자동완성 데이터 소스를 설정하는 방법을 단계별로 살펴보겠습니다.

3.1 기본 설정

from PyQt5.QtWidgets import QApplication, QLineEdit, QVBoxLayout, QWidget
from PyQt5.QtCore import QStringListModel

app = QApplication([])

window = QWidget()
layout = QVBoxLayout()
line_edit = QLineEdit()

layout.addWidget(line_edit)
window.setLayout(layout)
window.setWindowTitle('자동완성 예제')
window.show()

app.exec_()

위 코드 블록은 PyQt에서 기본적인 애플리케이션 윈도우를 생성하는 코드입니다. QLineEdit 위젯은 사용자가 텍스트를 입력할 수 있는 영역을 제공합니다.

3.2 자동완성 데이터 소스 준비하기

자동완성을 위한 데이터 소스를 준비해야 합니다. 여기서는 단순한 예제로 문자열 목록을 사용할 것입니다. 이 목록은 사용자 입력을 기반으로 자동완성 제안으로 제공됩니다.

data = ['Apple', 'Banana', 'Cherry', 'Date', 'Fig', 'Grape', 'Kiwi']
model = QStringListModel(data)

위의 코드에서는 여러 과일의 이름을 포함한 리스트를 생성하고, 이를 QStringListModel 클래스의 인스턴스로 초기화합니다. 이 모델은 QCompleter에 의해 사용됩니다.

3.3 QCompleter 설정하기

다음 단계에서는 생성한 데이터 모델과 QLineEdit 위젯을 연결하여 자동완성 기능을 구현합니다.

from PyQt5.QtWidgets import QCompleter

completer = QCompleter(model, window)
line_edit.setCompleter(completer)

이제 QCompleter 인스턴스를 생성하고, 우리가 생성한 모델을 해당 인스턴스에 연결합니다. 그리고 QLineEdit에 completer를 설정하여 자동완성 기능이 작동할 수 있도록 합니다.

3.4 전체 코드

지금까지의 모든 내용을 포함한 전체 코드는 다음과 같습니다.

from PyQt5.QtWidgets import QApplication, QLineEdit, QVBoxLayout, QWidget, QCompleter
from PyQt5.QtCore import QStringListModel

data = ['Apple', 'Banana', 'Cherry', 'Date', 'Fig', 'Grape', 'Kiwi']

app = QApplication([])

window = QWidget()
layout = QVBoxLayout()

line_edit = QLineEdit()
layout.addWidget(line_edit)

model = QStringListModel(data)
completer = QCompleter(model, window)
line_edit.setCompleter(completer)

window.setLayout(layout)
window.setWindowTitle('자동완성 예제')
window.show()

app.exec_()

이 코드를 실행하면, 사용자 입력을 기반으로 제안 목록이 나타나는 간단한 자동완성 기능이 구현됩니다.

4. 커스텀 자동완성 소스 설정하기

앞서 보여준 예제는 정적인 문자열 목록을 사용하였습니다. 하지만 실제 애플리케이션에서는 동적으로 자동완성 제안을 생성해야 할 수 있습니다. 다음은 사용자가 입력하는 동안 특정 조건에서 자동완성을 수행하는 예입니다.

4.1 동적 데이터 소스

사용자가 입력할 때마다 자동완성 제안을 업데이트하도록 설정할 수 있습니다. 이는 textChanged 시그널에 슬롯을 연결하여 구현할 수 있습니다.

def update_completer(text):
    filtered_data = [item for item in data if text.lower() in item.lower()]
    model.setStringList(filtered_data)

line_edit.textChanged.connect(update_completer)

위의 코드에서는 사용자가 텍스트를 입력할 때마다 자동완성 제안 목록을 업데이트하는 update_completer 함수를 정의했습니다. 이 함수는 사용자가 입력한 텍스트를 포함하는 목록 요소만 필터링하여 모델에 설정합니다.

4.2 전체 코드

from PyQt5.QtWidgets import QApplication, QLineEdit, QVBoxLayout, QWidget, QCompleter
from PyQt5.QtCore import QStringListModel

data = ['Apple', 'Banana', 'Cherry', 'Date', 'Fig', 'Grape', 'Kiwi']

app = QApplication([])

window = QWidget()
layout = QVBoxLayout()

line_edit = QLineEdit()
layout.addWidget(line_edit)

model = QStringListModel(data)
completer = QCompleter(model, window)
line_edit.setCompleter(completer)

def update_completer(text):
    filtered_data = [item for item in data if text.lower() in item.lower()]
    model.setStringList(filtered_data)

line_edit.textChanged.connect(update_completer)

window.setLayout(layout)
window.setWindowTitle('커스텀 자동완성 예제')
window.show()

app.exec_()

위 코드를 실행하면 사용자가 입력하는 동안 실시간으로 필터링된 결과가 자동완성 제안으로 표시됩니다.

5. 추가 기능 구현하기

자동완성 기능을 더욱 발전시키기 위해서는 다음과 같은 추가 기능을 고려할 수 있습니다.

5.1 키보드 내비게이션

자동완성 목록에서 방향키(위/아래)를 사용하여 항목을 탐색하고, Enter 키로 선택할 수 있는 기능을 추가할 수 있습니다.

5.2 사용자 정의 스타일

자동완성 목록의 항목을 사용자 정의하여 더 나은 시각적 경험을 제공할 수 있습니다. 예를 들어, 각 항목 옆에 이미지를 추가하거나 색상을 다르게 설정할 수 있습니다.

5.3 파일 또는 데이터베이스와 통합

정적인 데이터 대신 실시간 데이터베이스 쿼리 결과를 사용하여 자동완성 제안을 생성할 수 있습니다. 이를 통해 더 많은 데이터를 처리할 수 있습니다.

6. 결론

이번 글에서는 PyQt에서 커스텀 자동완성 기능을 구현하는 방법에 대해 살펴보았습니다. 간단한 예제부터 시작하여, 실시간으로 데이터를 필터링하는 방식으로 발전시킬 수 있음을 보여드렸습니다. PyQt의 유연한 GUI 구성 요소를 통해 다양한 방식으로 사용자 경험을 개선할 수 있습니다. 더 나아가 추가적인 기능을 구현함으로써 사용자 맞춤형 애플리케이션을 만드는 데 기여할 수 있습니다.

이제 여러분도 PyQt를 활용하여 자동완성 기능을 자유롭게 활용해보세요!