PyQt개발강좌, QGraphicsView와 QGraphicsScene을 이용한 2D 그래픽

이 강좌에서는 PyQt를 사용하여 2D 그래픽을 다루기 위한 QGraphicsViewQGraphicsScene 클래스에 대해 자세히 설명합니다. PyQt는 Python을 위한 GUI 툴킷으로, Qt 프레임워크를 기반으로 하며 크로스 플랫폼 애플리케이션을 개발하는 데 유용합니다. QGraphicsView와 QGraphicsScene은 2D 그래픽을 최적화된 방법으로 표시하고 관리하는 데 매우 유용한 도구들입니다.

1. QGraphicsView와 QGraphicsScene 소개

QGraphicsScene은 여러 그래픽 아이템(도형, 이미지 등)을 포함하고 있는 장면(scene)을 정의하는 클래스입니다. QGraphicsView는 이러한 장면을 시각적으로 표현하는 뷰(view)입니다. QGraphicsView와 QGraphicsScene의 조합을 통해 복잡한 2D 그래픽스 애플리케이션을 손쉽게 개발할 수 있습니다.

1.1. QGraphicsScene

QGraphicsScene은 다수의 그래픽 객체를 포함할 수 있으며, 이들은 다음과 같은 기능을 가지고 있습니다:

  • 아이템 관리: 여러 개의 그래픽 아이템을 추가하고, 삭제하고, 변형(변경)할 수 있습니다.
  • 좌표 시스템: 아이템은 서로 다른 좌표계를 가질 수 있으며, 장면 내에서 항상 고유한 아이디를 가집니다.
  • 이벤트 처리: 사용자 입력 이벤트를 처리하고, 적절한 반응을 할 수 있습니다.

1.2. QGraphicsView

QGraphicsView는 QGraphicsScene을 표현하는 데 필요한 컨테이너 역할을 합니다. 이를 통해 사용자 인터페이스에서 사용자와 상호작용할 수 있습니다. QGraphicsView의 주요 기능은 다음과 같습니다:

  • 스케일링: 사용자가 뷰의 크기를 조정할 수 있습니다.
  • 스크롤링: 장면 내의 특정 부분으로 스크롤할 수 있습니다.
  • 렌더링: 장면에 있는 모든 아이템을 렌더링하고 사용자에게 시각적으로 표시합니다.

2. 기본 설정

PyQt 환경을 설정하는 방법과 요구되는 라이브러리를 설치하는 방법에 대해 설명합니다. Python과 PyQt5 라이브러리를 설치하는 것이 기본적인 요구사항입니다.

pip install PyQt5

설치가 완료되면, 기본적인 PyQt 애플리케이션을 설정하는 방법을 설명하겠습니다.

2.1. 기본 PyQt 애플리케이션 설정

아래의 코드는 기본적인 PyQt 애플리케이션을 설정하는 예제입니다:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGraphicsScene

class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('2D Graphics with QGraphicsView and QGraphicsScene')
        self.setGeometry(100, 100, 800, 600)

        # QGraphicsScene 초기화
        self.scene = QGraphicsScene()
        self.view = QGraphicsView(self.scene, self)
        self.setCentralWidget(self.view)

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

3. QGraphicsScene에 아이템 추가하기

이제 QGraphicsScene에 다양한 아이템을 추가해 봅시다. PyQt에서는 여러 가지 그래픽 아이템을 지원하며, 이를 사용하여 장면을 구성할 수 있습니다.

3.1. 기본 도형 추가하기

QGraphicsScene에 간단한 도형을 추가하는 방법을 살펴보겠습니다.

from PyQt5.QtWidgets import QGraphicsEllipseItem, QGraphicsRectItem

# 원 추가
ellipse_item = QGraphicsEllipseItem(50, 50, 100, 100)  # (x, y, width, height)
ellipse_item.setBrush(Qt.red)  # 색상 설정
self.scene.addItem(ellipse_item)

# 사각형 추가
rect_item = QGraphicsRectItem(200, 50, 100, 100)
rect_item.setBrush(Qt.blue)
self.scene.addItem(rect_item)

3.2. 이미지 추가하기

QGraphicsScene에는 이미지를 추가할 수도 있습니다. 아래 예제는 이미지를 추가하는 방법을 보여줍니다:

from PyQt5.QtGui import QPixmap, QGraphicsPixmapItem

# 이미지 로드
pixmap_item = QGraphicsPixmapItem(QPixmap('path/to/your/image.png'))
self.scene.addItem(pixmap_item)

3.3. 텍스트 추가하기

QGraphicsScene에 텍스트를 추가하여 사용자에게 정보를 제공할 수 있습니다. 다음은 텍스트를 추가하는 방법입니다:

from PyQt5.QtWidgets import QGraphicsTextItem

# 텍스트 추가
text_item = QGraphicsTextItem("Hello QGraphicsScene")
text_item.setFont(QFont("Arial", 20))
self.scene.addItem(text_item)

4. 이벤트 처리 및 사용자 상호작용

QGraphicsView와 QGraphicsScene은 사용자와의 상호작용을 위해 이벤트를 처리할 수 있습니다. 사용자가 아이템을 클릭하거나 드래그할 수 있도록 만들 수 있습니다.

4.1. 클릭 이벤트 처리

아이템 클릭 이벤트를 처리하는 방법을 알아보겠습니다.

class CustomItem(QGraphicsRectItem):
    def __init__(self):
        super().__init__(0, 0, 100, 100)
        self.setBrush(Qt.green)

    def mousePressEvent(self, event):
        print("Item clicked!")

self.scene.addItem(CustomItem())

4.2. 드래그 이벤트 처리

사용자가 아이템을 드래그할 수 있도록 하려면 다음과 같이 할 수 있습니다:

class DraggableItem(QGraphicsRectItem):
    def mousePressEvent(self, event):
        self.setBrush(Qt.yellow)  # 선택 시 색 변경
        super().mousePressEvent(event)

    def mouseMoveEvent(self, event):
        self.setPos(event.pos())  # 새로운 위치로 이동
        super().mouseMoveEvent(event)

self.scene.addItem(DraggableItem())

5. 줌 및 스크롤 기능 구현

QGraphicsView에는 장면을 확대하고 축소할 수 있는 기능이 있습니다. 이를 구현하여 사용자에게 더욱 직관적인 경험을 제공할 수 있습니다.

5.1. 스크롤바 추가하기

스크롤바를 추가하는 방법은 다음과 같습니다:

self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)

5.2. 줌 기능 구현하기

줌 기능을 구현하기 위해 마우스 휠 이벤트를 사용할 수 있습니다.

class MyApp(QMainWindow):
    # ...

    def wheelEvent(self, event):
        factor = 1.1 if event.angleDelta().y() > 0 else 0.9
        self.view.scale(factor, factor)

6. 마무리 및 팁

이번 강좌에서는 PyQt의 QGraphicsView와 QGraphicsScene을 사용하여 간단한 2D 그래픽 애플리케이션을 만드는 방법을 배웠습니다. 다음 팁을 기억하며 개발을 진행하세요:

  • 아이템을 추가하거나 삭제할 때는 scene의 addItem() 및 removeItem() 메소드를 사용하세요.
  • 다양한 유형의 아이템을 활용하여 복잡한 장면을 구성해보세요.
  • 이벤트 핸들링을 통해 사용자와의 상호작용을 적극적으로 활용하세요.
  • 성능을 최적화하기 위해 필요한 부분에만 update()를 호출하세요.

이제 기본적인 2D 그래픽 애플리케이션을 개발할 수 있는 충분한 지식을 얻으셨길 바랍니다. PyQt는 매우 강력한 툴킷으로, 이를 통해 다양한 스타일의 애플리케이션을 구축할 수 있습니다. 여러분의 발전을 기원합니다!