PyQt개발강좌, MacOS Spotlight 같은 기능 구현, PyQt로 기본 검색 화면 디자인하기

안녕하세요, 여러분! 이번 블로그 포스트에서는 파이썬의 강력한 GUI 라이브러리인 PyQt를 사용하여 MacOS의 Spotlight 기능과 유사한 검색 기능을 구현하는 방법에 대해 알아보겠습니다. PyQt는 Python 언어로 크로스 플랫폼 GUI 애플리케이션을 개발할 수 있는 툴킷으로, 다양한 위젯과 레이아웃을 제공합니다. 강의의 목표는 기본 검색 화면을 디자인하고, 사용자 입력에 따라 실시간으로 결과를 필터링하는 기능을 구현하는 것입니다.

PyQt 소개

PyQt는 Qt 프레임워크의 파이썬 바인딩으로, 데스크탑 애플리케이션을 만들 때 널리 사용됩니다. PyQt는 다양한 위젯, 이벤트 및 레이아웃을 제공하여 빠르게 복잡한 사용자 인터페이스를 구축할 수 있게 도와줍니다. PyQt는 또한 매우 직관적인 API를 제공하며, 다양한 플랫폼에서 작동합니다.

Spotlight 기능 개요

MacOS의 Spotlight는 사용자가 입력한 키워드에 따라 파일, 애플리케이션, 그리고 기타 리소스를 검색할 수 있는 기능입니다. 이 기능을 구현하기 위해서는 사용자 입력을 받는 텍스트 필드, 검색 결과를 표시하는 리스트뷰, 그리고 그 외의 몇 가지 UI 요소가 필요합니다. 사용자가 입력하는 대로 결과가 실시간으로 업데이트되어야 합니다.

PyQt 설치하기

시작하기 위해 먼저 PyQt를 설치해야 합니다. 파이썬이 설치되어 있다면, 다음 pip 명령어를 사용하여 PyQt를 설치할 수 있습니다:

pip install PyQt5

기본 검색 화면 디자인하기

이제 본격적으로 PyQt를 사용하여 기본 검색 화면을 디자인해보겠습니다. 우리는 QMainWindow를 사용하여 메인 윈도우를 만들고, QWidget을 통해 각 요소를 배치할 것입니다. 전체 구조는 다음과 같습니다:

  • QLineEdit – 사용자가 검색할 키워드를 입력하는 필드
  • QListView – 검색 결과를 표시하는 리스트 뷰

이제 기본적인 코드 구조를 설정하겠습니다:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QListView, QVBoxLayout, QWidget, QStringListModel

class SpotlightSearch(QMainWindow):
    def __init__(self):
        super(SpotlightSearch, self).__init__()
        self.setWindowTitle('Spotlight Search')
        self.setGeometry(300, 300, 600, 400)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        self.search_box = QLineEdit(self)
        self.search_box.setPlaceholderText('검색할 내용을 입력하세요...')
        self.layout.addWidget(self.search_box)

        self.result_list = QListView(self)
        self.layout.addWidget(self.result_list)

        self.model = QStringListModel()
        self.result_list.setModel(self.model)

        self.search_box.textChanged.connect(self.update_results)

    def update_results(self, text):
        # 여기에 검색 결과를 필터링하는 로직 추가
        pass

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

검색 결과 필터링 로직 추가하기

이제 사용자가 입력하는 키워드에 따라 검색 결과를 필터링하는 로직을 추가할 것입니다.

    def update_results(self, text):
        all_items = ['Python', 'PyQt', 'Java', 'JavaScript', 'C++', 'C#', 'Ruby']
        filtered_items = [item for item in all_items if text.lower() in item.lower()]
        self.model.setStringList(filtered_items)

위의 코드는 사용자가 입력한 텍스트가 포함된 항목들만 리스트에 추가하는 역할을 합니다. 리스트에는 ‘Python’, ‘PyQt’, ‘Java’, ‘JavaScript’, ‘C++’, ‘C#’, 그리고 ‘Ruby’와 같은 프로그래밍 언어들이 포함되어 있습니다.

전체 코드

이제까지 구현한 코드를 한 곳에 모아보겠습니다:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QListView, QVBoxLayout, QWidget, QStringListModel

class SpotlightSearch(QMainWindow):
    def __init__(self):
        super(SpotlightSearch, self).__init__()
        self.setWindowTitle('Spotlight Search')
        self.setGeometry(300, 300, 600, 400)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        self.search_box = QLineEdit(self)
        self.search_box.setPlaceholderText('검색할 내용을 입력하세요...')
        self.layout.addWidget(self.search_box)

        self.result_list = QListView(self)
        self.layout.addWidget(self.result_list)

        self.model = QStringListModel()
        self.result_list.setModel(self.model)

        self.search_box.textChanged.connect(self.update_results)

    def update_results(self, text):
        all_items = ['Python', 'PyQt', 'Java', 'JavaScript', 'C++', 'C#', 'Ruby']
        filtered_items = [item for item in all_items if text.lower() in item.lower()]
        self.model.setStringList(filtered_items)

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

결과 실행

코드를 실행해 보시면, 검색 창에 텍스트를 입력할 때마다 필터링된 결과가 리스트 뷰에 표시되는 것을 확인할 수 있습니다. 이는 MacOS의 Spotlight 검색 기능과 유사한 동작입니다. 사용자가 입력하는 단어에 따라 실시간으로 검색 결과가 업데이트되며, 결과가 리스트에 동적으로 반영됩니다.

개선할 점

이번 강좌에서 구현한 기본적인 검색 기능은 간단하고 유용하지만, 몇 가지 개선 사항을 고려해볼 수 있습니다:

  • 데이터베이스 연결: 현재는 하드코딩된 데이터를 사용하고 있지만, 실제 애플리케이션에서는 데이터베이스와 연결하여 검색할 수 있도록 하는 것이 좋습니다.
  • 비동기 검색: 검색 기능이 무거워질 경우, 사용자가 입력하는 동안 애플리케이션이 멈추지 않도록 비동기적으로 검색을 처리할 수 있는 방법을 고민해볼 필요가 있습니다.
  • 스타일 개선: PyQt의 다양한 스타일을 활용하여 UI를 더욱 세련되게 만들 수 있습니다. QSS 파일을 통해 CSS처럼 스타일을 적용할 수 있습니다.

마무리

이번 포스팅에서는 PyQt를 활용하여 MacOS의 Spotlight와 유사한 검색 기능을 구현해보았습니다. PyQt의 다양한 기능과 강력함을 활용하여 좀 더 복잡한 애플리케이션으로 발전시킬 수 있습니다. 앞으로도 PyQt를 활용한 더 많은 프로젝트를 구현해보시길 바랍니다. 감사합니다!