위젯과 그래픽 보기의 제스처
Qt에는 사용된 입력 방법과 무관하게 일련의 이벤트에서 제스처를 형성할 수 있는 제스처 프로그래밍을 위한 프레임워크가 포함되어 있습니다. 제스처는 마우스의 특정 움직임, 터치 스크린 동작 또는 다른 소스로부터의 일련의 이벤트가 될 수 있습니다. 입력의 성격, 제스처의 해석 및 수행되는 동작은 개발자가 선택할 수 있습니다.
개요
QGesture 는 Qt 제스처 프레임워크의 중심 클래스로, 사용자가 수행하는 제스처에 대한 정보를 담는 컨테이너를 제공합니다. QGesture 는 모든 제스처에 공통적인 일반 정보를 제공하는 속성을 노출하며, 이를 확장하여 추가적인 제스처별 정보를 제공할 수 있습니다. 일반적인 패닝, 핀치, 스와이프 제스처는 특수 클래스로 표현됩니다: QPanGesture, QPinchGesture 및 QSwipeGesture 을 참조하세요.
개발자는 QGestureRecognizer 클래스를 서브클래싱하고 확장하여 새로운 제스처를 구현할 수도 있습니다. 새로운 제스처에 대한 지원을 추가하려면 입력 이벤트에서 제스처를 인식하는 코드를 구현해야 합니다. 이는 나만의 제스처 인식기 만들기 섹션에 설명되어 있습니다.
위젯과 함께 표준 제스처 사용하기
QWidget 및 QGraphicsObject 서브클래스의 인스턴스에 제스처를 활성화할 수 있습니다. 문서 전체에서 제스처 입력을 받는 객체를 대상 객체라고 합니다.
대상 객체에 제스처를 활성화하려면 필요한 제스처 유형을 설명하는 인수와 함께 QWidget::grabGesture() 또는 QGraphicsObject::grabGesture() 함수를 호출합니다. 표준 유형은 Qt::GestureType 열거형에 정의되어 있으며 일반적으로 사용되는 많은 제스처를 포함합니다.
for (Qt::GestureType gesture : gestures) grabGesture(gesture);
위 코드에서 제스처는 대상 객체 자체의 생성자에서 설정됩니다.
이벤트 처리
사용자가 제스처를 수행하면 QGestureEvent 이벤트가 대상 객체에 전달되며, 위젯의 경우 QWidget::event() 핸들러 함수를, 그래픽 객체의 경우 QGraphicsItem::sceneEvent() 함수를 재구현하여 처리할 수 있습니다.
하나의 대상 객체가 두 개 이상의 제스처 유형을 구독할 수 있으므로 QGestureEvent 에는 여러 개의 QGesture 이 포함될 수 있으며, 이는 동시에 여러 제스처가 활성화되어 있음을 나타냅니다. 그런 다음 여러 제스처를 처리하는 방법을 결정하고 다른 제스처를 위해 일부 제스처를 취소할지 여부를 선택하는 것은 위젯에 달려 있습니다.
QGestureEvent 객체 내에 포함된 각 QGesture 은 개별적으로 또는 모두 함께 허용() 또는 무시()할 수 있습니다. 또한 여러 개의 게터를 사용하여 개별 QGesture 데이터 객체(상태)를 쿼리할 수 있습니다.
이벤트 처리를 위한 표준 프로시저
QGesture 이벤트가 위젯에 도착하면 기본적으로 수락됩니다. 그러나 항상 명시적으로 제스처를 수락하거나 거부하는 것이 좋습니다. 일반적으로 제스처를 수락하면 해당 제스처를 사용하는 것입니다. 제스처를 무시하면 관심이 없는 것입니다. 제스처를 무시하면 다른 대상 객체에 제스처가 제공되거나 취소될 수 있습니다.
각 QGesture 에는 여러 가지 상태가 있으며, 상태를 변경하는 잘 정의된 방법이 있으며, 일반적으로 사용자 입력이 상태 변경의 원인(예: 상호작용 시작 및 중지)이지만 위젯이 상태 변경을 일으킬 수도 있습니다.
특정 QGesture 이 위젯이나 그래픽 항목에 처음 전달되면 Qt::GestureStarted 상태가 됩니다. 이때 제스처를 처리하는 방식에 따라 나중에 제스처와 상호 작용할 수 있는지 여부가 달라집니다.
- 제스처를 수락하면 위젯이 제스처에 따라 동작하고 Qt::GestureUpdated상태로 제스처가 이어집니다.
- 제스처를 무시하면 제스처가 다시는 제공되지 않습니다. 부모 위젯이나 아이템에도 제스처가 제공될 것입니다.
- 제스처가 시작 상태이고 수락되었을 때 제스처에 대해 setGestureCancelPolicy()를 호출하면 다른 제스처가 취소될 수 있습니다.
QGesture::CancelAllInContext 을 사용하여 제스처를 취소하면 명시적으로 수락되지 않는 한 모든 상태에 있는 모든 제스처가 취소됩니다. 즉, 어린이에 대한 활성 제스처가 취소됩니다. 또한 동일한 QGestureEvent 에서 전달된 제스처도 위젯이 이를 무시하면 취소된다는 의미입니다. 이는 관심 있는 제스처를 제외한 모든 제스처를 필터링하는 데 유용한 방법이 될 수 있습니다.
이벤트 처리 예시
편의를 위해 이미지 제스처 예제에서는 일반적인 event() 핸들러 함수를 재구현하고 제스처 이벤트를 특수한 gestureEvent() 함수에 위임합니다:
bool ImageWidget::event(QEvent *event) { if (event->type() == QEvent::Gesture) return gestureEvent(static_cast<QGestureEvent*>(event)); return QWidget::event(event); }
대상 객체에 전달된 제스처 이벤트를 개별적으로 검사하고 적절하게 처리할 수 있습니다:
bool ImageWidget::gestureEvent(QGestureEvent *event) { qCDebug(lcExample) << "gestureEvent():" << event; if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) swipeTriggered(static_cast<QSwipeGesture *>(swipe)); else if (QGesture *pan = event->gesture(Qt::PanGesture)) panTriggered(static_cast<QPanGesture *>(pan)); if (QGesture *pinch = event->gesture(Qt::PinchGesture)) pinchTriggered(static_cast<QPinchGesture *>(pinch)); return true; }
제스처에 대한 응답은 대상 객체로 전송된 QGestureEvent 에서 전달된 QGesture 객체를 가져와 그 안에 포함된 정보를 검사하기만 하면 됩니다.
void ImageWidget::swipeTriggered(QSwipeGesture *gesture) { if (gesture->state() == Qt::GestureFinished) { if (gesture->horizontalDirection() == QSwipeGesture::Left || gesture->verticalDirection() == QSwipeGesture::Up) { qCDebug(lcExample) << "swipeTriggered(): swipe to previous"; goPrevImage(); } else { qCDebug(lcExample) << "swipeTriggered(): swipe to next"; goNextImage(); } update(); } }
여기서는 사용자가 위젯을 스와이프한 방향을 살펴보고 그에 따라 위젯의 내용을 수정합니다.
나만의 제스처 인식기 만들기
새로운 제스처에 대한 지원을 추가하려면 새로운 제스처 인식기를 생성하고 등록해야 합니다. 제스처 인식 프로세스에 따라 새 제스처 객체를 생성해야 할 수도 있습니다.
새 인식기를 만들려면 QGestureRecognizer 을 서브클래스화하여 사용자 지정 인식기 클래스를 만들어야 합니다. 재구현해야 하는 가상 함수가 하나 있고 필요에 따라 재구현할 수 있는 다른 두 개의 함수가 있습니다.
입력 이벤트 필터링하기
recognize() 함수를 다시 구현해야 합니다. 이 함수는 대상 객체에 대한 수신 입력 이벤트를 처리하고 필터링하여 인식기가 찾고 있는 제스처에 해당하는지 여부를 결정합니다.
제스처 인식을 위한 로직은 이 함수에서 구현되지만 Qt::GestureState 열거형에 기반한 상태 머신을 사용할 수도 있지만, 제공된 QGesture 객체에 인식 프로세스의 상태에 대한 영구적인 정보를 저장할 수 있습니다.
recognize() 함수는 주어진 제스처와 대상 객체의 인식 상태를 나타내는 QGestureRecognizer::Result 값을 반환해야 합니다. 이 값에 따라 제스처 이벤트가 대상 객체에 전달될지 여부가 결정됩니다.
사용자 지정 제스처
사용자 지정 QGesture 하위 클래스로 제스처를 표현하기로 선택한 경우 표준 QGesture 인스턴스 대신 제스처 클래스의 인스턴스를 구성하기 위해 create() 함수를 다시 구현해야 합니다. 또는 표준 QGesture 인스턴스를 사용하되 처리하려는 제스처의 구체적인 세부 사항을 표현하기 위해 동적 속성을 추가할 수도 있습니다.
제스처 재설정하기
제스처가 취소될 때 재설정하거나 특수하게 처리해야 하는 사용자 지정 제스처 개체를 사용하는 경우 이러한 특수 작업을 수행하려면 reset() 함수를 다시 구현해야 합니다.
QGesture 객체는 대상 객체와 제스처 유형의 각 조합에 대해 한 번만 생성되며, 사용자가 대상 객체에 대해 동일한 제스처 유형을 수행하려고 할 때마다 재사용될 수 있다는 점에 유의하세요. 따라서 이전에 제스처 인식을 시도할 때마다 reset() 함수를 다시 구현하여 정리하는 것이 유용할 수 있습니다.
새 제스처 인식기 사용
제스처 인식기를 사용하려면 QGestureRecognizer 서브클래스의 인스턴스를 구성하고 QGestureRecognizer::registerRecognizer()를 사용하여 애플리케이션에 등록합니다. 지정된 제스처 유형에 대한 인식기는 QGestureRecognizer::unregisterRecognizer()로 제거할 수 있습니다.
추가 자료
이미지 제스처 예제에서는 간단한 이미지 뷰어 애플리케이션에서 위젯에 제스처를 활성화하는 방법을 보여줍니다.
의 제스처 Qt Quick
Qt Quick 에는 일반적인 전역 제스처 인식기가 없으며, 개별 컴포넌트가 자체적인 방식으로 터치 이벤트에 응답할 수 있습니다. 예를 들어 PinchArea 은 두 손가락 제스처를 처리하고 Flickable 은 한 손가락으로 콘텐츠를 쓸어 넘기며 MultiPointTouchArea 은 임의의 수의 터치 포인트를 처리할 수 있으며 애플리케이션 개발자가 사용자 지정 제스처 인식 코드를 작성할 수 있습니다.
© 2025 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.