이 페이지에서

그래픽 뷰 프레임워크

Graphics View는 다수의 사용자 정의 2D 그래픽 항목을 관리하고 상호 작용할 수 있는 표면과, 확대/축소 및 회전 기능을 지원하는 항목을 시각화하는 뷰 위젯을 제공합니다.

이 프레임워크에는 씬 내 항목에 대한 정밀한 상호작용 기능을 가능하게 하는 이벤트 전파 아키텍처가 포함되어 있습니다. 항목은 키 이벤트, 마우스 클릭, 이동, 릴리스 및 더블 클릭 이벤트를 처리할 수 있으며, 마우스 움직임도 추적할 수 있습니다.

Graphics View는 BSP(이진 공간 분할) 트리를 사용하여 매우 빠른 항목 검색 기능을 제공하며, 그 결과 수백만 개의 항목이 있는 대규모 장면도 실시간으로 시각화할 수 있습니다.

Graphics View는 Qt 4.2에서 도입되어 이전 버전인 QCanvas를 대체했습니다.

그래픽스 뷰 아키텍처

Graphics View는 InterView의 편의 클래스 QTableView, QTreeView 및 QListView 와 매우 유사하게, 모델-뷰 프로그래밍에 항목 기반의 접근 방식을 제공합니다. 여러 뷰가 하나의 장면을 관찰할 수 있으며, 장면에는 다양한 기하학적 모양의 항목들이 포함됩니다.

`Scene`

QGraphicsScene 는 그래픽 뷰(Graphics View)의 씬을 제공합니다. 씬은 다음과 같은 역할을 수행합니다:

  • 다수의 항목을 관리하기 위한 빠른 인터페이스 제공
  • 각 항목에 이벤트를 전달
  • 선택 및 포커스 처리와 같은 항목 상태 관리
  • 변환되지 않은 렌더링 기능 제공(주로 인쇄용)

이 씬은 ` QGraphicsItem ` 객체의 컨테이너 역할을 합니다. 항목은 ` QGraphicsScene::addItem()`를 호출하여 씬에 추가되며, 이후 다양한 항목 탐색 함수 중 하나를 호출하여 검색할 수 있습니다. ` QGraphicsScene::items()` 및 그 오버로드 함수들은 점, 사각형, 다각형 또는 일반 벡터 경로에 포함되거나 교차하는 모든 항목을 반환합니다. ` QGraphicsScene::itemAt()는 특정 지점에 위치한 최상위 항목을 반환합니다. 모든 항목 탐색 함수는 스택 순서대로 내림차순으로 항목을 반환합니다(즉, 가장 먼저 반환된 항목이 최상위이고, 마지막 항목이 최하위입니다).

QGraphicsScene scene;
QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));

QGraphicsItem *item = scene.itemAt(50, 50, QTransform());

QGraphicsScene의 이벤트 전파 아키텍처는 아이템으로 전달될 씬 이벤트를 스케줄링하고, 아이템 간의 전파도 관리합니다. 씬이 특정 위치에서 마우스 클릭 이벤트를 수신하면, 씬은 해당 위치에 있는 아이템으로 이벤트를 전달합니다.

QGraphicsScene 또한 항목 선택 및 포커스와 같은 특정 항목 상태를 관리합니다. 임의의 도형을 매개변수로 전달하여 ` QGraphicsScene::setSelectionArea()`를 호출함으로써 씬에서 항목을 선택할 수 있습니다. 이 기능은 ` QGraphicsView`에서 고무줄 선택의 기초로도 사용됩니다. 현재 선택된 모든 항목의 목록을 얻으려면 ` QGraphicsScene::selectedItems()`를 호출하십시오. ` QGraphicsScene `가 처리하는 또 다른 상태는 항목이 키보드 입력 포커스를 가지고 있는지 여부입니다. QGraphicsScene::setFocusItem() 또는 QGraphicsItem::setFocus()을 호출하여 항목에 포커스를 설정하거나, QGraphicsScene::focusItem()을 호출하여 현재 포커스가 있는 항목을 가져올 수 있습니다.

마지막으로, ` QGraphicsScene `을 사용하면 ` QGraphicsScene::render()` 함수를 통해 씬의 일부를 페인트 장치에 렌더링할 수 있습니다. 이에 대한 자세한 내용은 이 문서의 뒷부분에 있는 ‘인쇄(Printing)’ 섹션에서 확인할 수 있습니다.

View

QGraphicsView 는 씬의 내용을 시각화하는 뷰 위젯을 제공합니다. 동일한 씬에 여러 뷰를 연결하여, 동일한 데이터 세트에 대한 여러 뷰포트를 제공할 수 있습니다. 뷰 위젯은 스크롤 영역이며, 대규모 씬을 탐색할 수 있도록 스크롤 막대를 제공합니다. OpenGL 지원을 활성화하려면 QGraphicsView::setViewport()를 호출하여 QOpenGLWidget 를 뷰포트로 설정할 수 있습니다.

QGraphicsScene scene;
myPopulateScene(&scene);
QGraphicsView view(&scene);
view.show();

뷰는 키보드와 마우스에서 입력 이벤트를 수신하고, 이를 장면 이벤트로 변환한 후(필요한 경우 사용된 좌표를 장면 좌표로 변환) 시각화된 장면으로 이벤트를 전송합니다.

뷰는 변환 행렬인 ` QGraphicsView::transform()`을 사용하여 씬의 좌표계를 변환할 수 있습니다. 이를 통해 확대/축소 및 회전과 같은 고급 탐색 기능을 사용할 수 있습니다. 편의상 ` QGraphicsView `은 뷰 좌표와 씬 좌표 간 변환을 위한 함수인 ` QGraphicsView::mapToScene()` 및 ` QGraphicsView::mapFromScene()`도 제공합니다.

컴퓨터 칩 배열

Item

QGraphicsItem 는 씬 내 그래픽 아이템의 기본 클래스입니다. Graphics View는 사각형(QGraphicsRectItem), 타원(QGraphicsEllipseItem) 및 텍스트 아이템(QGraphicsTextItem)과 같은 일반적인 도형을 위한 몇 가지 표준 아이템을 제공하지만, 사용자 정의 아이템을 작성할 때 QGraphicsItem 의 가장 강력한 기능을 활용할 수 있습니다. 무엇보다도, QGraphicsItem 는 다음과 같은 기능을 지원합니다:

  • 마우스 클릭, 이동, 해제 및 더블 클릭 이벤트는 물론, 마우스 호버 이벤트, 휠 이벤트, 컨텍스트 메뉴 이벤트도 지원합니다.
  • 키보드 입력 포커스 및 키 이벤트
  • 드래그 앤 드롭
  • 부모-자식 관계를 통한 그룹화 및 QGraphicsItemGroup
  • 충돌 감지

항목은 로컬 좌표계에 존재하며, QGraphicsView 와 마찬가지로 항목과 씬 간, 그리고 항목과 항목 간의 좌표를 매핑하는 다양한 기능을 제공합니다. 또한, QGraphicsView 와 마찬가지로 행렬을 사용하여 좌표계를 변환할 수 있습니다: QGraphicsItem::transform(). 이는 개별 항목을 회전하거나 크기를 조정할 때 유용합니다.

항목은 다른 항목(자식)을 포함할 수 있습니다. 부모 항목의 변환은 모든 자식 항목에 상속됩니다. 그러나 항목의 누적된 변환과 관계없이, 모든 함수(예: QGraphicsItem::contains(), QGraphicsItem::boundingRect(), QGraphicsItem::collidesWith())는 여전히 국소 좌표계에서 작동합니다.

QGraphicsItem 는 QGraphicsItem::shape() 함수와 QGraphicsItem::collidesWith()를 통해 충돌 감지를 지원하며, 이 두 함수는 모두 가상 함수입니다. QGraphicsItem::shape()에서 항목의 모양을 로컬 좌표 QPainterPath 로 반환하면, QGraphicsItem 가 모든 충돌 감지를 자동으로 처리해 줍니다. 그러나 사용자 정의 충돌 감지 기능을 구현하려면 QGraphicsItem::collidesWith()를 재구현할 수 있습니다.

격자 위의 다양한 모양과 그래픽

Graphics View Framework의 클래스

이 클래스들은 대화형 애플리케이션을 생성하기 위한 프레임워크를 제공합니다.

QAbstractGraphicsShapeItem

모든 경로 항목에 대한 공통 기반

QGraphicsAnchor

QGraphicsAnchorLayout 내 두 항목 사이의 앵커를 나타냅니다.

QGraphicsAnchorLayout

Graphics View에서 위젯을 서로 고정할 수 있는 레이아웃

QGraphicsEffect

모든 Graphical Effects의 기본 클래스

QGraphicsEllipseItem

QGraphicsScene에 추가할 수 있는 타원(Ellipse) 항목

QGraphicsGridLayout

Graphics View에서 위젯을 관리하기 위한 그리드 레이아웃

QGraphicsItem

QGraphicsScene 내의 모든 그래픽 항목에 대한 기본 클래스

QGraphicsItemGroup

항목 그룹을 단일 항목으로 취급하는 컨테이너

QGraphicsLayout

Graphics View의 모든 레이아웃을 위한 기본 클래스

QGraphicsLayoutItem

상속받아 사용자 정의 항목을 레이아웃으로 관리할 수 있게 해줍니다

QGraphicsLineItem

QGraphicsScene에 추가할 수 있는 라인 항목

QGraphicsLinearLayout

Graphics View에서 위젯을 관리하기 위한 가로 또는 세로 레이아웃

QGraphicsObject

신호, 슬롯 및 속성이 필요한 모든 그래픽 항목의 기본 클래스

QGraphicsPathItem

QGraphicsScene에 추가할 수 있는 경로 항목

QGraphicsPixmapItem

QGraphicsScene에 추가할 수 있는 픽스맵(Pixmap) 항목

QGraphicsPolygonItem

QGraphicsScene에 추가할 수 있는 Polygon 항목

QGraphicsProxyWidget

QGraphicsScene에 QWidget을 삽입하기 위한 프록시 레이어

QGraphicsRectItem

QGraphicsScene에 추가할 수 있는 Rectangle 항목

QGraphicsScene

다량의 2D 그래픽 항목을 관리하기 위한 서피스

QGraphicsSceneContextMenuEvent

그래픽 뷰 프레임워크의 컨텍스트 메뉴 이벤트

QGraphicsSceneDragDropEvent

그래픽 뷰 프레임워크의 드래그 앤 드롭 이벤트

QGraphicsSceneEvent

모든 그래픽 뷰 관련 이벤트를 위한 기본 클래스

QGraphicsSceneHelpEvent

툴팁이 요청될 때 발생하는 이벤트

QGraphicsSceneHoverEvent

그래픽 뷰 프레임워크의 호버 이벤트

QGraphicsSceneMouseEvent

그래픽 뷰 프레임워크의 마우스 이벤트

QGraphicsSceneMoveEvent

그래픽 뷰 프레임워크에서 위젯 이동 시 발생하는 이벤트

QGraphicsSceneResizeEvent

그래픽 뷰 프레임워크에서 위젯 크기 조정 시 발생하는 이벤트

QGraphicsSceneWheelEvent

그래픽 뷰 프레임워크의 휠 이벤트

QGraphicsSimpleTextItem

QGraphicsScene에 추가할 수 있는 간단한 텍스트 항목

QGraphicsSvgItem

SVG 파일의 내용을 렌더링하는 데 사용할 수 있는 QGraphicsItem

QGraphicsTextItem

서식이 지정된 텍스트를 표시하기 위해 QGraphicsScene에 추가할 수 있는 텍스트 항목

QGraphicsTransform

QGraphicsItem에 대한 고급 변환을 구축하기 위한 추상 기본 클래스

QGraphicsView

QGraphicsScene의 내용을 표시하는 위젯

QGraphicsWidget

QGraphicsScene 내 모든 위젯 항목의 기본 클래스

QStyleOptionGraphicsItem

QGraphicsItem을 그리기 위해 필요한 매개변수를 기술하는 데 사용됩니다

그래픽 뷰 좌표계

Graphics View는 직교 좌표계를 기반으로 하며, 씬 내 항목의 위치와 기하학적 구조는 x 좌표와 y 좌표라는 두 개의 숫자 쌍으로 표현됩니다. 변환되지 않은 뷰를 사용하여 씬을 관찰할 때, 씬상의 1단위는 화면상의 1픽셀로 표현됩니다.

참고: 그래픽 뷰는 Qt의 좌표계를 사용하므로, Y축이 반전된좌표계 ( y 이 위쪽으로 증가하는 경우)는 지원되지 않습니다.

Graphics View에서는 항목 좌표, 장면 좌표, 뷰 좌표라는 세 가지 실제 좌표계가 사용됩니다. 구현을 단순화하기 위해 Graphics View는 이 세 좌표계 간 변환을 가능하게 하는 편의 함수를 제공합니다.

렌더링 시, Graphics View의 장면 좌표는 QPainter 의 논리 좌표에 해당하며, 뷰 좌표는 장치 좌표와 동일합니다. ‘좌표계’ 문서에서 논리 좌표와 장치 좌표 간의 관계에 대해 자세히 확인할 수 있습니다.

여러 좌표계 변환

항목 좌표

항목은 자체 로컬 좌표계에 존재합니다. 항목의 좌표는 일반적으로 중심점(0, 0)을 중심으로 하며, 이 지점은 모든 변환의 중심이기도 합니다. 항목 좌표계의 기하학적 기본 도형은 흔히 항목 점, 항목 선 또는 항목 사각형이라고 불립니다.

사용자 정의 항목을 생성할 때는 항목 좌표만 신경 쓰면 됩니다. ` QGraphicsScene ` 및 ` QGraphicsView `가 모든 변환을 자동으로 처리해 줍니다. 덕분에 사용자 정의 항목을 매우 쉽게 구현할 수 있습니다. 예를 들어, 마우스 클릭이나 드래그 시작 이벤트를 수신하면 이벤트 위치는 아이템 좌표계로 제공됩니다. 특정 점이 아이템 내에 있으면 ` true `를, 그렇지 않으면 `false`를 반환하는 ` QGraphicsItem::contains()` 가상 함수는 아이템 좌표계의 점 인자를 받습니다. 마찬가지로, 아이템의 경계 사각형(bounding rect)과 모양(shape)도 아이템 좌표계에 있습니다.

항목의 위치는 부모의 좌표계에서 해당 항목의 중심점 좌표를 의미하며, 때로는 부모 좌표라고도 합니다. 이러한 의미에서 씬은 부모가 없는 모든 항목의 “부모”로 간주됩니다. 최상위 항목의 위치는 씬 좌표로 표시됩니다.

자식 항목의 좌표는 부모 항목의 좌표계를 기준으로 합니다. 자식 항목이 변환되지 않은 상태라면, 자식 좌표와 부모 좌표 간의 차이는 부모 좌표계에서 두 항목 간의 거리와 동일합니다. 예를 들어, 변환되지 않은 자식 항목이 부모 항목의 중심점에 정확히 위치해 있다면, 두 항목의 좌표계는 동일해집니다. 그러나 자식 항목의 위치가 (10, 0)인 경우, 자식 항목의 (0, 10) 지점은 부모 항목의 (10, 10) 지점에 해당합니다.

아이템의 위치와 변형은 부모를 기준으로 하기 때문에, 부모의 변형이 자식 아이템을 암묵적으로 변형시키기는 하지만 자식 아이템의 좌표는 부모의 변형에 영향을 받지 않습니다. 위의 예에서, 부모가 회전하거나 크기가 조정되더라도 자식의 (0, 10) 지점은 여전히 부모의 (10, 10) 지점에 해당합니다. 그러나 씬을 기준으로 볼 때, 자식은 부모의 변환과 위치를 따릅니다. 부모가 (2x, 2x)로 크기가 조정되면, 자식의 위치는 장면 좌표 (20, 0)에 위치하게 되며, 자식의 (10, 0) 지점은 장면상의 (40, 0) 지점에 해당합니다.

QGraphicsItem::pos()가 몇 안 되는 예외 중 하나인 것을 제외하면, QGraphicsItem 의 함수들은 해당 아이템이나 그 부모의 변환과 관계없이 아이템 좌표계에서 작동합니다. 예를 들어, 아이템의 경계 사각형(즉, QGraphicsItem::boundingRect())은 항상 아이템 좌표계로 표시됩니다.

씬 좌표계

씬은 그 안에 포함된 모든 항목에 대한 기본 좌표계를 나타냅니다. 씬 좌표계는 각 최상위 항목의 위치를 설명하며, 뷰에서 씬으로 전달되는 모든 씬 이벤트의 기초가 되기도 합니다. 씬의 각 아이템은 자체의 로컬 위치와 경계 사각형 외에도 씬 위치와 경계 사각형(QGraphicsItem::scenePos(), QGraphicsItem::sceneBoundingRect())을 가집니다. 씬 위치는 씬 좌표계에서 아이템의 위치를 나타내며, 씬 경계 사각형은 QGraphicsScene 가 씬의 어떤 영역이 변경되었는지 판단하는 기준이 됩니다. 씬의 변경 사항은 ` QGraphicsScene::changed()` 신호를 통해 전달되며, 인수는 씬 사각형들의 리스트입니다.

뷰 좌표

뷰 좌표는 위젯의 좌표입니다. 뷰 좌표의 각 단위는 1픽셀에 해당합니다. 이 좌표계의 특별한 점은 위젯 또는 뷰포트에 상대적이며, 관측되는 씬의 영향을 받지 않는다는 것입니다. QGraphicsView 의 뷰포트 왼쪽 상단 모서리는 항상 (0, 0)이며, 오른쪽 하단 모서리는 항상 (뷰포트 너비, 뷰포트 높이)입니다. 모든 마우스 이벤트와 드래그 앤 드롭 이벤트는 원래 뷰 좌표로 수신되며, 항목과 상호 작용하려면 이러한 좌표를 씬에 매핑해야 합니다.

좌표 매핑

대개 씬 내의 항목을 다룰 때, 씬의 좌표와 임의의 도형을 항목에 매핑하거나, 항목 간에 매핑하거나, 뷰에서 씬으로 매핑하는 것이 유용할 수 있습니다. 예를 들어, QGraphicsView 의 뷰포트에서 마우스를 클릭하면, QGraphicsView::mapToScene()를 호출한 다음 QGraphicsScene::itemAt()를 호출하여 커서 아래에 있는 항목이 무엇인지 씬에 물어볼 수 있습니다. 항목이 뷰포트 내 어디에 위치하는지 알고 싶다면, 해당 항목에 대해 QGraphicsItem::mapToScene()를 호출한 다음, 뷰에 대해 QGraphicsView::mapFromScene()를 호출하면 됩니다. 마지막으로, 뷰 타원형 영역 내에 어떤 항목들이 있는지 확인하려면, QPainterPath 를 mapToScene()에 전달한 다음, 매핑된 경로를 QGraphicsScene::items()에 전달하면 됩니다.

QGraphicsItem::mapToScene() 및 QGraphicsItem::mapFromScene()을 호출하여 좌표와 도형을 아이템의 장면으로, 또는 장면에서 아이템으로 매핑할 수 있습니다. 또한 QGraphicsItem::mapToParent() 및 QGraphicsItem::mapFromParent()을 호출하여 아이템의 상위 아이템으로 매핑하거나, QGraphicsItem::mapToItem() 및 QGraphicsItem::mapFromItem()을 호출하여 아이템 간에 매핑할 수도 있습니다. 모든 매핑 함수는 점, 직사각형, 다각형 및 경로를 모두 매핑할 수 있습니다.

뷰에서도 장면과의 상호 매핑을 위해 동일한 매핑 함수를 사용할 수 있습니다. QGraphicsView::mapFromScene() 및 QGraphicsView::mapToScene(). 뷰에서 항목으로 매핑하려면 먼저 장면으로 매핑한 다음, 장면에서 항목으로 매핑해야 합니다.

주요 기능

확대/축소 및 회전

QGraphicsView QPainter 가 QGraphicsView::setMatrix()를 통해 제공하는 것과 동일한 아핀 변환을 지원합니다. 뷰에 변환을 적용함으로써 확대/축소 및 회전과 같은 일반적인 탐색 기능을 쉽게 추가할 수 있습니다.

다음은 QGraphicsView 의 하위 클래스에서 확대/축소 및 회전 슬롯을 구현하는 예시입니다:

class View : public QGraphicsView
{
Q_OBJECT
    //...
public slots:
    void zoomIn() { scale(1.2, 1.2); }
    void zoomOut() { scale(1 / 1.2, 1 / 1.2); }
    void rotateLeft() { rotate(-10); }
    void rotateRight() { rotate(10); }
    //...
};

autoRepeat 가 활성화된 상태에서 슬롯을 QToolButtons 에 연결할 수 있습니다.

QGraphicsView 뷰를 변환할 때 뷰의 중심이 정렬된 상태를 유지합니다.

기본 확대/축소 기능을 구현하는 방법을 보여주는 코드는 ‘Elastic Nodes’ 예제를 참조하십시오.

인쇄

Graphics View는 렌더링 함수인 ` QGraphicsScene::render()`와 ` QGraphicsView::render()`를 통해 한 줄 단위의 출력 기능을 제공합니다. 이 함수들은 동일한 API를 제공합니다. 두 렌더링 함수 중 하나에 ` QPainter `를 전달함으로써, 씬이나 뷰의 전체 또는 일부 내용을 임의의 페인트 장치에 렌더링할 수 있습니다. 이 예제는 QPrinter를 사용하여 전체 씬을 한 페이지에 출력하는 방법을 보여줍니다.

QGraphicsScene scene;
QPrinter printer;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));

if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
    QPainter painter(&printer);
    painter.setRenderHint(QPainter::Antialiasing);
    scene.render(&painter);
}

씬 렌더링 함수와 뷰 렌더링 함수의 차이점은, 하나는 씬 좌표계에서 작동하고 다른 하나는 뷰 좌표계에서 작동한다는 점입니다. QGraphicsScene::render()는 기하학적 데이터를 플로팅하거나 텍스트 문서를 출력하는 등, 변환되지 않은 상태로 장면의 전체 세그먼트를 출력할 때 주로 사용됩니다. 반면, QGraphicsView::render()는 스크린샷을 찍는 데 적합하며, 기본 동작은 제공된 페인터를 사용하여 뷰포트의 정확한 내용을 렌더링하는 것입니다.

QGraphicsScene scene;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));

QPixmap pixmap;
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
painter.end();

pixmap.save("scene.png");

소스 영역과 대상 영역의 크기가 일치하지 않을 경우, 소스 콘텐츠는 대상 영역에 맞도록 늘어나게 됩니다. 사용 중인 렌더링 함수에 ` Qt::AspectRatioMode `를 전달하면, 콘텐츠가 늘어나는 과정에서 장면의 종횡비를 유지할 것인지 무시할 것인지 선택할 수 있습니다.

드래그 앤 드롭

QGraphicsView 는 QWidget 를 간접적으로 상속받기 때문에, QWidget 가 제공하는 것과 동일한 드래그 앤 드롭 기능을 이미 제공합니다. 또한 편의성을 위해 Graphics View 프레임워크는 씬과 모든 항목에 대해 드래그 앤 드롭 지원을 제공합니다. 뷰는 드래그 이벤트를 수신하면, 이를 QGraphicsSceneDragDropEvent 로 변환한 후 씬으로 전달합니다. 씬은 이 이벤트의 스케줄링을 담당하며, 마우스 커서 아래에 있는 드롭을 허용하는 첫 번째 항목으로 이벤트를 전송합니다.

항목에서 드래그를 시작하려면, 드래그를 시작하는 위젯에 대한 포인터를 전달하여 ` QDrag ` 객체를 생성하십시오. 항목은 여러 뷰에서 동시에 관찰될 수 있지만, 드래그를 시작할 수 있는 뷰는 하나뿐입니다. 드래그는 대부분의 경우 마우스를 누르거나 움직이는 결과로 시작되므로, mousePressEvent() 또는 mouseMoveEvent()에서 이벤트로부터 드래그를 시작한 위젯의 포인터를 얻을 수 있습니다. 예를 들어:

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QMimeData *data = new QMimeData;
    QDrag *drag = new QDrag(event->widget());
    drag->setMimeData(data);
    drag->exec();
}

씬의 드래그 앤 드롭 이벤트를 가로채려면, ` QGraphicsItem `의 서브클래스에서 ` QGraphicsScene::dragEnterEvent()` 메서드와 해당 씬에 필요한 이벤트 핸들러를 재구현해야 합니다. Graphics View의 드래그 앤 드롭에 대한 자세한 내용은 ` QGraphicsScene`의 각 이벤트 핸들러 문서를 참조하십시오.

항목은 ` QGraphicsItem::setAcceptDrops()`를 호출하여 드래그 앤 드롭 기능을 활성화할 수 있습니다. 들어오는 드래그를 처리하려면 ` QGraphicsItem::dragEnterEvent()`, ` QGraphicsItem::dragMoveEvent()`, ` QGraphicsItem::dragLeaveEvent()` 및 ` QGraphicsItem::dropEvent()`을 재구현하십시오.

Graphics View가 드래그 앤 드롭 작업을 지원하는 방식에 대한 시연은 ‘Drag and Drop Robot’ 예제를 참조하십시오.

커서 및 툴팁

QWidget 와 마찬가지로, QGraphicsItem 도 커서(QGraphicsItem::setCursor())와 툴팁(QGraphicsItem::setToolTip())을 지원합니다. 커서와 툴팁은 마우스 커서가 항목 영역에 진입하면( QGraphicsItem::contains() 호출을 통해 감지됨) QGraphicsView 에 의해 활성화됩니다.

QGraphicsView::setCursor()를 호출하여 뷰에서 직접 기본 커서를 설정할 수도 있습니다.

툴팁 및 커서 모양 처리를 구현한 코드는 ‘Drag and Drop Robot’ 예제를 참조하십시오.

애니메이션

Graphics View는 여러 수준에서 애니메이션을 지원합니다. Animation Framework를 사용하면 애니메이션을 쉽게 구성할 수 있습니다. 이를 위해서는 아이템이 QGraphicsObject 를 상속받도록 하고, QPropertyAnimation 를 해당 아이템에 연결해야 합니다. QPropertyAnimation 를 사용하면 QObject 의 모든 속성을 애니메이션화할 수 있습니다.

또 다른 방법은 ` QObject `와 ` QGraphicsItem`를 상속받는 사용자 정의 항목을 생성하는 것입니다. 이 항목은 자체 타이머를 설정하고, ` QObject::timerEvent()`를 통해 단계별로 애니메이션을 제어할 수 있습니다.

세 번째 방법은 주로 Qt 3의 QCanvas와의 호환성을 위해 제공되는 것으로, QGraphicsScene::advance()를 호출하여 씬을 진행시키는 것입니다. 이 함수는 다시 QGraphicsItem::advance()를 호출합니다.

OpenGL 렌더링

OpenGL 렌더링을 활성화하려면, QGraphicsView::setViewport()를 호출하여 새로운 QOpenGLWidget 를 QGraphicsView 의 뷰포트로 설정하기만 하면 됩니다. 앤티앨리어싱이 적용된 OpenGL을 사용하려면, 필요한 샘플 수를 가진 QSurfaceFormat 를 설정해야 합니다( QSurfaceFormat::setSamples() 참조).

예시:

QGraphicsView view(&scene);
QOpenGLWidget *gl = new QOpenGLWidget();
QSurfaceFormat format;
format.setSamples(4);
gl->setFormat(format);
view.setViewport(gl);

아이템 그룹

한 항목을 다른 항목의 자식으로 설정하면 항목 그룹화의 가장 핵심적인 기능을 활용할 수 있습니다. 즉, 항목들이 함께 이동하며 모든 변환이 부모에서 자식으로 전달됩니다.

또한, 그룹 부모( QGraphicsItemGroup )는 자식 이벤트 처리를 그룹에 항목을 추가하거나 제거하는 데 유용한 인터페이스와 결합한 특수한 항목입니다. 그룹 부모( QGraphicsItemGroup )에 항목을 추가하면 해당 항목의 원래 위치와 변환이 유지되지만, 일반적으로 항목의 부모를 변경하면 자식 항목은 새로운 부모를 기준으로 위치를 재조정하게 됩니다. 편의를 위해 QGraphicsScene::createItemGroup()를 호출하여 씬 내에서 QGraphicsItemGroup를 생성할 수 있습니다.

위젯과 레이아웃

Qt 4.4에서는 QGraphicsWidget 를 통해 기하 구조 및 레이아웃을 인식하는 항목에 대한 지원이 도입되었습니다. 이 특수한 기본 항목은 QWidget 와 유사하지만, QWidget 와는 달리 QPaintDevice 을 상속받지 않고 대신 QGraphicsItem 을 상속받습니다. 이를 통해 이벤트, 시그널 및 슬롯, 크기 힌트 및 정책을 갖춘 완전한 위젯을 작성할 수 있으며, QGraphicsLinearLayout 및 QGraphicsGridLayout 를 통해 레이아웃에서 위젯의 기하 구조를 관리할 수도 있습니다.

QGraphicsWidget

QGraphicsItem 의 기능과 가벼운 메모리 사용량을 기반으로 하는 QGraphicsWidget 는 두 가지 장점을 모두 제공합니다. 즉, QWidget 에서 제공하는 스타일, 글꼴, 팔레트, 레이아웃 방향 및 기하학적 속성과 같은 추가 기능과, QGraphicsItem 에서 제공하는 해상도 독립성 및 변환 지원이 결합되어 있습니다. Graphics View는 정수 대신 실제 좌표를 사용하므로, QGraphicsWidget 의 기하학적 함수는 QRectF 및 QPointF 에서도 작동합니다. 이는 프레임 사각형, 여백 및 간격에도 적용됩니다. 예를 들어, QGraphicsWidget 에서는 콘텐츠 여백을 (0.5, 0.5, 0.5, 0.5)로 지정하는 경우가 드물지 않습니다. 서브위젯과 “최상위” 창을 모두 생성할 수 있으며, 경우에 따라 이제 고급 MDI 애플리케이션을 위해 Graphics View를 사용할 수도 있습니다.

QWidget 의 일부 속성(창 플래그 및 속성 포함)은 지원되지만, 전부는 아닙니다. 지원되는 항목과 지원되지 않는 항목에 대한 전체적인 개요를 확인하려면 QGraphicsWidget 의 클래스 문서를 참조하십시오. 예를 들어, QGraphicsWidget 의 생성자에 Qt::Window 창 플래그를 전달하여 장식된 창을 만들 수 있지만, Graphics View는 현재 macOS에서 흔히 사용되는 Qt::Sheet 및 Qt::Drawer 플래그를 지원하지 않습니다.

QGraphicsLayout

QGraphicsLayout 는 QGraphicsWidget 을 위해 특별히 설계된 2세대 레이아웃 프레임워크의 일부입니다. 이 프레임워크의 API는 QLayout 의 API와 매우 유사합니다. QGraphicsLinearLayout 과 QGraphicsGridLayout 내부에서 위젯과 하위 레이아웃을 관리할 수 있습니다. 또한 QGraphicsLayout 을 직접 서브클래싱하여 자신만의 레이아웃을 쉽게 작성하거나, QGraphicsLayoutItem 의 어댑터 서브클래스를 작성하여 레이아웃에 자신만의 QGraphicsItem 항목을 추가할 수도 있습니다.

임베디드 위젯 지원

Graphics View는 어떤 위젯이든 씬에 매끄럽게 임베드할 수 있도록 지원합니다. QLineEdit 이나 QPushButton 와 같은 간단한 위젯은 물론, QTabWidget 와 같은 복잡한 위젯, 심지어 전체 메인 윈도우까지 임베드할 수 있습니다. 위젯을 씬에 임베드하려면 QGraphicsScene::addWidget()를 호출하거나, QGraphicsProxyWidget 의 인스턴스를 생성하여 위젯을 수동으로 임베드하면 됩니다.

QGraphicsProxyWidget 를 통해 Graphics View는 커서, 툴팁, 마우스, 태블릿 및 키보드 이벤트, 자식 위젯, 애니메이션, 팝업(예: QComboBox 또는 QCompleter), 위젯의 입력 포커스 및 활성화 등 클라이언트 위젯 기능을 깊이 있게 통합할 수 있습니다. QGraphicsProxyWidget 심지어 내장된 위젯의 탭 순서까지 통합하여, 탭 키를 사용하여 내장된 위젯을 오갈 수 있습니다. 심지어 새로운 QGraphicsView 를 씬에 내장하여 복잡한 중첩 씬을 구성할 수도 있습니다.

임베디드 위젯을 변형할 때, 그래픽 뷰는 위젯이 해상도에 독립적으로 변형되도록 보장하여, 확대 시에도 글꼴과 스타일이 선명하게 유지됩니다. (해상도 독립성의 효과는 스타일에 따라 달라질 수 있습니다.)

성능

부동 소수점 명령어

항목에 변환 및 효과를 정확하고 빠르게 적용하기 위해, 그래픽 뷰는 사용자의 하드웨어가 부동 소수점 명령어에 대해 적절한 성능을 제공할 수 있다는 전제 하에 구축되었습니다.

많은 워크스테이션과 데스크톱 컴퓨터에는 이러한 종류의 계산을 가속화할 수 있는 적절한 하드웨어가 탑재되어 있지만, 일부 임베디드 장치는 수학적 연산을 처리하거나 소프트웨어에서 부동 소수점 명령어를 에뮬레이션하는 라이브러리만 제공할 수도 있습니다.

그 결과, 특정 기기에서는 일부 효과의 실행 속도가 예상보다 느려질 수 있습니다. 다른 영역에서 최적화를 수행함으로써(예: OpenGL을 사용하여 장면을 렌더링하는 경우) 이러한 성능 저하를 상쇄할 수 있습니다. 그러나 이러한 최적화 방법 자체가 부동소수점 하드웨어의 존재에 의존하는 경우, 오히려 성능 저하를 초래할 수도 있습니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.