PyQt개발강좌, MacOS Spotlight 같은 기능 구현, Qt의 QPixmap과 QTimer를 이용해 주기적인 이미지 전환 구현

PyQt는 파이썬 프로그래밍 언어를 위한 Python 바인딩으로, Qt 애플리케이션 프레임워크를 사용할 수 있게 도와줍니다.
Qt는 매우 강력한 GUI 프레임워크로, 다양한 플랫폼에서 사용할 수 있는 응용 프로그램을 개발할 수 있게 해줍니다.
이 글에서는 MacOS에서 제공하는 Spotlight와 유사한 기능을 구현하는 방법에 대해 알아보겠습니다.
Spotlight는 사용자가 입력한 텍스트를 기반으로 파일 및 애플리케이션을 검색할 수 있는 기능입니다.

QPixmap과 QTimer를 이용한 이미지 전환 구현

본 강좌에서는 PyQt에서 QPixmapQTimer 클래스를 이용하여 주기적인 이미지 전환 기능을 구현할 것입니다.
QPixmap 클래스는 이미지 파일을 쉽게 로드하고 표시할 수 있도록 도와주며,
QTimer 클래스는 주기적으로 특정 작업을 실행할 수 있게 해줍니다.

개발 환경 설정

PyQt를 사용하기 위해 먼저 PyQt5를 설치해야 합니다. 다음 명령을 사용하여 PyQt5를 설치합니다:

pip install PyQt5

기본 구조와 UI 구성

먼저 기본 애플리케이션 구조를 설정하고 UI를 구성하는 단계입니다.
QWidget를 기본 윈도우로 설정하고, 그 안에 QLabel을 추가하여 이미지를 표시할 영역을 만들겠습니다.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QTimer

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

    def initUI(self):
        self.setWindowTitle('Spotlight Simulator')
        self.setGeometry(100, 100, 600, 400)

        # 레이아웃 설정
        layout = QVBoxLayout()
        self.label = QLabel(self)
        layout.addWidget(self.label)
        self.setLayout(layout)

        # 이미지 로드
        self.imageList = ['image1.jpg', 'image2.jpg', 'image3.jpg']
        self.currentIndex = 0
        self.displayImage()

        # QTimer 설정
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.updateImage)
        self.timer.start(2000)  # 2초 간격으로 이미지 전환

    def displayImage(self):
        pixmap = QPixmap(self.imageList[self.currentIndex])
        self.label.setPixmap(pixmap.scaled(self.label.size(), aspectRatioMode=True))

    def updateImage(self):
        self.currentIndex = (self.currentIndex + 1) % len(self.imageList)
        self.displayImage()

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

코드 설명

위의 코드는 PyQt5를 이용한 기본 애플리케이션 구조입니다.
SpotlightApp 클래스는 QWidget을 상속받아 UI를 초기화하고 주기적으로 이미지를 변경하는 기능을 포함하고 있습니다.

  • __init__: 초기화 메서드로, UI를 설정하는 initUI 메서드를 호출합니다.
  • initUI: UI의 레이아웃과 이미지를 표시할 QLabel을 생성합니다.
    QTimer를 설정하여 2초 간격으로 updateImage 메서드를 호출합니다.
  • displayImage: 현재 인덱스에 해당하는 이미지를 QLabel에 표시합니다.
  • updateImage: 현재 인덱스를 증가시켜 다음 이미지를 표기합니다.
    이미지를 순환적으로 표시하기 위해 인덱스를 이미지 목록의 길이로 나눈 나머지를 사용합니다.

이미지 전환 효과 추가하기

이미지 전환 시 간단한 페이드 효과를 추가하여 UX를 향상시킬 수 있습니다.
페이드 효과는 현재 이미지를 서서히 투명하게 만든 후 다음 이미지를 표시하는 방식으로 구현할 수 있습니다.
이를 위해 QGraphicsOpacityEffect를 사용할 수 있습니다.

from PyQt5.QtWidgets import QGraphicsOpacityEffect

    def displayImage(self):
        pixmap = QPixmap(self.imageList[self.currentIndex])
        self.label.setPixmap(pixmap.scaled(self.label.size(), aspectRatioMode=True))

        # Opacity 효과 설정
        effect = QGraphicsOpacityEffect()
        effect.setOpacity(0)
        self.label.setGraphicsEffect(effect)

        # 페이드 효과 애니메이션
        fade_in = QPropertyAnimation(effect, b'opacity')
        fade_in.setDuration(1000)  # 1초 동안 페이드 인
        fade_in.setStartValue(0)
        fade_in.setEndValue(1)
        fade_in.start(QAbstractAnimation.DeleteWhenStopped)

완성된 프로그램

위의 코드 완성된 프로그램 모양은 아래와 같이 됩니다:

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

    def initUI(self):
        self.setWindowTitle('Spotlight Simulator')
        self.setGeometry(100, 100, 600, 400)

        layout = QVBoxLayout()
        self.label = QLabel(self)
        layout.addWidget(self.label)
        self.setLayout(layout)

        self.imageList = ['image1.jpg', 'image2.jpg', 'image3.jpg']
        self.currentIndex = 0
        self.displayImage()

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.updateImage)
        self.timer.start(2000)

    def displayImage(self):
        pixmap = QPixmap(self.imageList[self.currentIndex])
        self.label.setPixmap(pixmap.scaled(self.label.size(), aspectRatioMode=True))

        effect = QGraphicsOpacityEffect()
        effect.setOpacity(0)
        self.label.setGraphicsEffect(effect)

        fade_in = QPropertyAnimation(effect, b'opacity')
        fade_in.setDuration(1000)
        fade_in.setStartValue(0)
        fade_in.setEndValue(1)
        fade_in.start(QAbstractAnimation.DeleteWhenStopped)

    def updateImage(self):
        self.currentIndex = (self.currentIndex + 1) % len(self.imageList)
        self.displayImage()

결론

이번 강좌에서는 PyQt로 MacOS Spotlight와 유사한 이미지 전환 기능을 구현하는 방법에 대해 알아보았습니다.
기본적인 QLabel과 QPixmap을 이용하여 이미지를 표시하고, QTimer로 주기적인 이미지 전환을 구현했습니다.
또한 페이드 효과를 추가하여 더 매끄러운 전환을 구현하였습니다.
여러분의 창의력을 발휘하여 다양한 UI 요소와 효과를 추가하여 더욱 나만의 애플리케이션을 만들어 보세요.
파이썬과 PyQt를 활용하면 자신의 아이디어를 신속하고 쉽게 구현할 수 있습니다.