qevent 예제

Comments 0 by
August 2, 2019

이벤트가 배달되는 일반적인 방법은 가상 함수를 호출하는 것입니다. 예를 들어 QPaintEvent는 QWidget::paintEvent()를 호출하여 전달됩니다. 이 가상 함수는 일반적으로 위젯을 다시 그리는 작업을 적절하게 반응합니다. 가상 함수 구현에 필요한 모든 작업을 수행하지 않는 경우 기본 클래스의 구현을 호출해야 할 수 있습니다. 대부분의 이벤트가 필요한 경우 Qt 또는 창 시스템에 의해 자동으로 생성되기 때문에 Qt 응용 프로그램은 postEvent() 또는 sendEvent()를 직접 호출할 필요가 거의 없습니다. 이벤트를 보내려는 대부분의 경우 Qt에는 이를 수행하는 고급 함수(예: update() 및 다시 그리기))가 포함됩니다. 주요 이벤트는 키프레스이벤트() 및 키릴리즈이벤트()를 다시 구현하여 처리됩니다. 플로터 위젯은 키프레스이벤트()를 다시 구현합니다. 일반적으로 릴리스가 중요한 유일한 키는 수정자 키 Ctrl, Shift 및 Alt이므로 키프레스이벤트()를 다시 구현하면 되며 QKeyEvent::수정자()를 사용하여 키프레스이벤트()에서 확인할 수 있습니다. 예를 들어 CodeEditor 위젯을 구현하는 경우 홈과 Ctrl+Home을 구분하는 제거된 키PressEvent()는 다음과 같이 표시됩니다. 예를 들어 마우스 누근거기 이벤트는 이벤트가 발생했을 때 마우스 포인터가 배치된 위치뿐만 아니라 이벤트를 트리거한 마우스 단추를 저장해야 합니다. 이 추가 정보는 QMouseEvent와 같은 전용 QEvent 하위 클래스에 저장됩니다.

postEvent()는 나중에 디스패치할 수 있는 큐에 이벤트를 게시합니다. 다음에 Qt의 기본 이벤트 루프가 실행되면 게시된 모든 이벤트를 일부 최적화하여 디스패치합니다. 예를 들어 여러 크기의 크기 조정 이벤트가 있는 경우 하나로 압축됩니다. 페인트 이벤트에도 동일하게 적용됩니다: QWidget::update() 는 postEvent()를 호출하여 깜박임을 제거하고 여러 번 다시 그리기를 피하여 속도를 높입니다. 이벤트는 신호와 혼동해서는 안 됩니다. 일반적으로 신호는 위젯을 사용할 때 유용하지만 이벤트는 위젯을 구현할 때 유용합니다. 예를 들어 QPushButton을 사용하는 경우 신호가 방출되는 로우 레벨 마우스 또는 키 이벤트보다 clicked() 신호에 더 관심이 있습니다. 그러나 QPushButton과 같은 클래스를 구현하는 경우 마우스 및 키 이벤트를 처리하고 필요한 경우 clicked() 신호를 내보낼 코드를 작성해야 합니다. 이 예제에서는 사용자가 Esc를 누르면 doEscape()라고 부르고 이벤트가 수락됩니다(기본값).

이벤트는 상위 위젯으로 전파되지 않습니다. 사용자가 다른 키를 누르면 QWidget의 기본 구현이라고 합니다. Qt는 열거형 값으로 식별되는 100개 이상의 이벤트 유형을 처리합니다. 예를 들어 QEvent::type()는 마우스 누개 이벤트에 대해 QEvent::MouseButtonPress를 반환합니다. 개체가 다른 개체에 전달되는 이벤트를 보고 가로챌 수 있는 경우가 있습니다. 예를 들어 대화 상자는 일반적으로 일부 위젯에 대한 키 누를 필터링하려고 합니다. 예를 들어 반환 키 처리를 수정합니다. Qt를 사용하면 고유한 이벤트 유형을 만들 수 있습니다.

이 기술은 GUI 스레드와 통신하는 수단으로 다중 스레드 응용 프로그램에서 특히 유용합니다. Qt 3(p. 359)이 있는 C++ GUI 프로그래밍의 17장을 참조하십시오. 예를 들어 키 이벤트가 전파됩니다. 포커스가 있는 위젯이 특정 키를 처리하지 않는 경우 Qt는 상위 위젯에 동일한 이벤트를 디스패치한 다음 상위 위젯에 도달할 때까지 부모 위젯에 디스패치합니다.