PyQt개발강좌, QLineEdit, QTextEdit에서 자동완성 적용

Python의 GUI 라이브러리인 PyQt는 강력한 도구로, 다양한 종류의 응용 프로그램을 개발하는 데 매우 유용합니다. 본 강좌에서는 PyQt를 사용하여 QLineEditQTextEdit 위젯에 자동완성 기능을 적용하는 방법에 대해 상세히 설명하겠습니다. 자동완성 기능은 텍스트 입력을 간편하게 하고 사용자의 경험을 크게 향상시킬 수 있는 유용한 기능입니다.

1. 자동완성이란?

자동완성 기능은 사용자가 텍스트 입력을 시작할 때, 이전에 입력한 값이나 미리 정의된 내용을 바탕으로 가능한 선택을 제공하는 기능입니다. 이를 통해 사용자는 더욱 빠르게 입력할 수 있으며, 오타를 줄이는 데도 기여할 수 있습니다.

2. PyQt에서 QLineEdit와 QTextEdit

QLineEdit는 한 줄의 텍스트를 입력하는 데 사용되는 위젯입니다. 반면에 QTextEdit는 여러 줄의 텍스트를 입력할 수 있는 위젯으로, 더 복잡한 텍스트 편집 기능을 제공합니다. 두 위젯 모두 자동완성 기능을 적용할 수 있습니다.

3. QLineEdit에서 자동완성 적용하기

QLineEdit에 자동완성 기능을 추가하려면, 먼저 입력된 내용을 기반으로 가능한 자동완성 후보 목록을 설정해야 합니다. 다음은 QLineEdit에서 자동완성을 구현하는 기본적인 예제입니다.

3.1 예제 코드


import sys
from PyQt5.QtWidgets import QApplication, QLineEdit, QCompleter, QWidget, QVBoxLayout

class AutoCompleteLineEdit(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.layout = QVBoxLayout()

        # QLineEdit 생성
        self.line_edit = QLineEdit(self)
        self.line_edit.setPlaceholderText("자동완성 입력")

        # 자동완성 후보 목록
        words = ["Python", "PyQt", "PyTorch", "Pandas", "NumPy", "Matplotlib"]
        
        # QCompleter를 사용하여 자동완성 생성
        completer = QCompleter(words, self.line_edit)
        completer.setCaseSensitivity(False)  # 대소문자 구분하지 않기
        self.line_edit.setCompleter(completer)

        # 레이아웃에 QLineEdit 추가
        self.layout.addWidget(self.line_edit)
        self.setLayout(self.layout)

        self.setWindowTitle("QLineEdit 자동완성")
        self.setGeometry(300, 300, 300, 100)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = AutoCompleteLineEdit()
    window.show()
    sys.exit(app.exec_())

위의 코드는 QLineEdit에 주어진 목록을 기반으로 자동완성을 구현합니다. 사용자가 글자를 입력할 때마다, QCompleter는 자동완성 목록을 업데이트하여 일치하는 제안을 제공합니다.

4. QTextEdit에서 자동완성 구현하기

QTextEdit에서도 자동완성을 구현할 수 있지만, QLineEdit과는 조금 다르게 작동합니다. QTextEdit은 여러 줄의 텍스트를 지원하므로, 사용자가 현재 커서 위치에 따라 자동완성을 제공해야 합니다.

4.1 예제 코드


import sys
from PyQt5.QtWidgets import QApplication, QTextEdit, QCompleter, QWidget, QVBoxLayout

class AutoCompleteTextEdit(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.layout = QVBoxLayout()

        # QTextEdit 생성
        self.text_edit = QTextEdit(self)
        self.text_edit.setPlaceholderText("여기에 텍스트를 입력하세요...")

        # 자동완성 후보 목록
        words = ["Python", "Java", "JavaScript", "C++", "C#", "Ruby", "Go"]

        # QCompleter를 사용하여 자동완성 생성
        self.completer = QCompleter(words, self.text_edit)
        self.completer.setCaseSensitivity(False)  # 대소문자 구분하지 않기
        self.text_edit.setCompleter(self.completer)

        # 레이아웃에 QTextEdit 추가
        self.layout.addWidget(self.text_edit)
        self.setLayout(self.layout)

        self.setWindowTitle("QTextEdit 자동완성")
        self.setGeometry(300, 300, 400, 300)

        # 자동완성 호출을 위한 신호 연결
        self.text_edit.textChanged.connect(self.updateCompleter)

    def updateCompleter(self):
        # 텍스트박스에서 현재 입력 중인 단어 가져오기
        cursor = self.text_edit.textCursor()
        cursor.select(cursor.WordUnderCursor)
        word = cursor.selectedText()

        if word:
            self.completer.setCompletionPrefix(word)
            self.completer.complete()  # 자동완성 목록 업데이트

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = AutoCompleteTextEdit()
    window.show()
    sys.exit(app.exec_())

이 코드는 QTextEdit에서 커서 아래에 있는 단어를 기반으로 자동완성을 구현합니다. 사용자가 텍스트를 입력하면, 현재 단어에 대해 자동완성 목록을 업데이트하여 편리한 입력을 제공합니다.

5. 다양한 자동완성 후보 목록 관리하기

자동완성 후보 목록은 고정된 리스트일 수도 있지만, 데이터베이스 조회나 사용자 입력 기반으로 동적으로 생성될 수도 있습니다. 이를 통해 사용자 맞춤형 경험을 제공할 수 있습니다.

5.1 예제: 동적 후보 목록 생성


import sys
from PyQt5.QtWidgets import QApplication, QLineEdit, QCompleter, QWidget, QVBoxLayout

class DynamicAutoComplete(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.layout = QVBoxLayout()

        self.line_edit = QLineEdit(self)
        self.line_edit.setPlaceholderText("자동완성 입력")

        # 초기 데이터
        self.words = ["Python", "PyQt", "PyTorch", "Pandas", "NumPy", "Matplotlib"]
        self.completer = QCompleter(self.words, self.line_edit)
        self.completer.setCaseSensitivity(False)
        self.line_edit.setCompleter(self.completer)

        self.layout.addWidget(self.line_edit)
        self.setLayout(self.layout)

        self.line_edit.textChanged.connect(self.onTextChanged)

        self.setWindowTitle("동적 자동완성")
        self.setGeometry(300, 300, 300, 100)

    def onTextChanged(self, text):
        # 입력에 따라 자동완성 후보 목록 변경
        new_words = [word for word in self.words if word.lower().startswith(text.lower())]
        self.completer.model().setStringList(new_words)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DynamicAutoComplete()
    window.show()
    sys.exit(app.exec_())

이 예제에서는 사용자가 입력할 때마다 자동완성 후보 목록이 갱신됩니다. 입력된 문자열로 시작하는 단어들만 남기고 나머지는 제거하여 사용자에게 가장 관련성이 높은 제안을 제공합니다.

6. 입력 형식 검증 및 오류 처리

자동완성 기능을 구현할 때, 사용자 입력을 처리하는 과정에서 오류가 발생할 수 있습니다. 이를 위해 입력 형식 검증과 예외 처리를 적절히 구현하는 것이 중요합니다. 예를 들어, 특정 조건에 맞지 않는 입력에 대해서는 자동완성을 제공하지 않거나, 경고 메시지를 보여줄 수 있습니다.

6.1 기본 검증 예제


class ValidateInput(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.layout = QVBoxLayout()
        self.line_edit = QLineEdit(self)
        self.line_edit.setPlaceholderText("자동완성 입력")

        self.completer = QCompleter(["Python", "Java", "C++"], self)
        self.line_edit.setCompleter(self.completer)

        self.layout.addWidget(self.line_edit)
        self.setLayout(self.layout)

        self.line_edit.textChanged.connect(self.validateInput)

        self.setWindowTitle("입력 검증")
        self.setGeometry(300, 300, 300, 100)

    def validateInput(self, text):
        if not text.isalpha():  # 입력값이 알파벳일 때만 허용
            self.line_edit.setStyleSheet("color: red;")  # 경고 표시
        else:
            self.line_edit.setStyleSheet("color: black;")  # 정상 상태

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ValidateInput()
    window.show()
    sys.exit(app.exec_())

위의 코드에서는 입력값이 알파벳인지 체크하며, 알파벳이 아닐 경우에는 입력란의 글자 색을 빨간색으로 바꾸어 사용자가 주의할 수 있도록 합니다.

7. 마무리

이번 강좌에서는 PyQt의 QLineEdit과 QTextEdit에서 자동완성 기능을 구현하는 방법에 대해 알아보았습니다. 자동완성 기능은 사용자 경험을 향상시키고 입력 효율성을 증대시키는 등 많은 장점을 제공합니다.

이번 강좌를 통해 배운 내용들을 바탕으로 더욱 발전된 GUI 응용 프로그램을 개발할 수 있기를 바랍니다. PyQt에 대한 더 많은 학습과 경험을 통해 더 나은 개발자로 성장할 수 있는 기회가 되기를 바랍니다.

Copyright © 2023 PyQt 강좌. All Rights Reserved.