[파이썬] PyQt 그래픽 뷰 (`QGraphicsView`) 및 그래픽 항목

PyQt는 파이썬에서 GUI 애플리케이션을 만들기 위한 강력한 프레임워크입니다. PyQt는 Qt 프레임워크의 파이썬 바인딩이며, Qt는 크로스 플랫폼 애플리케이션 개발을 위한 거의 모든 도구와 기능을 제공합니다.

그래픽 뷰 (QGraphicsView)는 PyQt에서 제공하는 중요한 위젯 중 하나입니다. 이 뷰를 사용하면 2D 그래픽 항목을 표시하고 상호작용할 수 있는 GUI 애플리케이션을 구축할 수 있습니다.

그래픽 뷰의 기본 사용법

그래픽 뷰를 사용하기 위해 PyQt에서 QGraphicsView 클래스를 임포트해야 합니다. 그런 다음, 그래픽 뷰를 생성하고 윈도우에 추가할 수 있습니다. 다음은 기본적인 그래픽 뷰 사용 예시입니다:

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

if __name__ == "__main__":
    app = QApplication(sys.argv)
    
    # 윈도우 생성
    window = QMainWindow()
    window.setWindowTitle("그래픽 뷰 예시")
    
    # 그래픽 뷰 생성
    view = QGraphicsView(window)
    scene = QGraphicsScene()
    view.setScene(scene)
    
    # 윈도우 크기 조정
    window.setCentralWidget(view)
    window.setGeometry(0, 0, 800, 600)
    
    # 윈도우 표시
    window.show()
    
    sys.exit(app.exec())

위의 코드는 PyQt 애플리케이션에서 간단한 윈도우를 생성하고, 그래픽 뷰를 추가하여 뷰에 그래픽 항목을 표시합니다.

그래픽 항목 생성 및 표시

그래픽 뷰에 항목을 표시하려면 QGraphicsItem 클래스를 사용해야 합니다. 이 클래스는 그래픽 항목을 생성하고 제어하는 데 사용됩니다.

다음은 간단한 원 그래픽 항목을 생성하고 그래픽 뷰에 추가하는 예시입니다:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGraphicsScene
from PyQt5.QtGui import QBrush, QPen, QColor
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QGraphicsEllipseItem

if __name__ == "__main__":
    app = QApplication(sys.argv)
    
    window = QMainWindow()
    window.setWindowTitle("그래픽 항목 예시")
    
    view = QGraphicsView(window)
    scene = QGraphicsScene()
    view.setScene(scene)
    scene.setSceneRect(0, 0, 800, 600)  # 장면 크기 설정
    
    # 원 그래픽 항목 생성
    brush = QBrush(Qt.red)
    pen = QPen(QColor(255, 0, 0))
    ellipse = QGraphicsEllipseItem(0, 0, 100, 100)
    ellipse.setBrush(brush)
    ellipse.setPen(pen)
    ellipse.setPos(100, 100)  # 항목 위치 설정
    
    # 그래픽 항목 추가
    scene.addItem(ellipse)
    
    window.setCentralWidget(view)
    window.setGeometry(0, 0, 800, 600)
    window.show()
    
    sys.exit(app.exec())

위의 예시 코드에서는 원 그래픽 항목을 생성하고 색상과 펜 스타일을 설정하여 뷰에 추가합니다. 항목의 크기와 위치도 설정할 수 있습니다.

마우스 이벤트 처리

그래픽 뷰(QGraphicsView)와 그래픽 항목(QGraphicsItem)은 마우스 이벤트를 처리하는 다양한 기능을 제공합니다. 이를 통해 마우스 클릭, 드래그 및 이동과 같은 사용자 상호작용을 감지하고 대응할 수 있습니다.

다음은 마우스 이벤트 처리를 위한 예시 코드입니다:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGraphicsScene
from PyQt5.QtGui import QBrush, QPen, QColor
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QGraphicsEllipseItem

class MyGraphicsView(QGraphicsView):
    def __init__(self, parent=None):
        super().__init__(parent)
        
    def mousePressEvent(self, event):
        # 마우스가 그래픽 뷰에서 클릭되었을 때 실행되는 코드
        print("마우스가 그래픽 뷰에서 클릭됨")
        super().mousePressEvent(event)
    
    def mouseMoveEvent(self, event):
        # 마우스가 그래픽 뷰에서 움직였을 때 실행되는 코드
        print("마우스가 그래픽 뷰에서 움직임")
        super().mouseMoveEvent(event)
    
    def mouseReleaseEvent(self, event):
        # 마우스 버튼이 놓여졌을 때 실행되는 코드
        print("마우스 버튼 놓음")
        super().mouseReleaseEvent(event)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    
    window = QMainWindow()
    window.setWindowTitle("마우스 이벤트 처리 예시")
    
    view = MyGraphicsView(window)  # 커스텀 그래픽 뷰 사용
    scene = QGraphicsScene()
    view.setScene(scene)
    scene.setSceneRect(0, 0, 800, 600)
    
    brush = QBrush(Qt.red)
    pen = QPen(QColor(255, 0, 0))
    ellipse = QGraphicsEllipseItem(0, 0, 100, 100)
    ellipse.setBrush(brush)
    ellipse.setPen(pen)
    ellipse.setPos(100, 100)
    
    scene.addItem(ellipse)
    
    window.setCentralWidget(view)
    window.setGeometry(0, 0, 800, 600)
    window.show()
    
    sys.exit(app.exec())

위의 코드에서는 QGraphicsView 클래스를 상속하여 커스텀 그래픽 뷰(MyGraphicsView)를 만듭니다. 마우스 클릭, 이동 및 버튼 놓기 이벤트를 처리하는 메서드를 오버라이드하여 원하는 동작을 정의할 수 있습니다.

결론

PyQt의 그래픽 뷰(QGraphicsView)와 그래픽 항목(QGraphicsItem)은 파이썬으로 강력하고 유연한 GUI 애플리케이션을 개발하는 데 도움이 됩니다. 이 뷰와 항목을 사용하여 다양한 그래픽 요소를 표시하고 사용자 상호작용에 응답하는 애플리케이션을 만들 수 있습니다.