본문 바로가기
Python Library/PySide

[PySide] 이벤트

by goatlab 2022. 6. 13.
728x90
반응형
SMALL

이벤트

 

사용자가 Qt 응용 프로그램과 갖는 모든 상호 작용은 이벤트이다. 다양한 유형의 이벤트가 있으며 각각은 서로 다른 유형의 상호 작용을 나타낸다. Qt는 일어난 일에 대한 정보를 패키지화하는 이벤트 객체를 사용하여 이러한 이벤트를 나타낸다. 이러한 이벤트는 상호 작용이 발생한 위젯의 특정 이벤트 핸들러로 전달된다.

 

사용자 정의 또는 확장 이벤트 핸들러 를 정의 하여 위젯이 이러한 이벤트에 응답하는 방식을 변경할 수 있다. 이벤트 핸들러는 다른 메소드와 마찬가지로 정의되지만 이름은 핸들러가 처리하는 이벤트 유형에 따라 다르다.

 

위젯이 수신하는 주요 이벤트 중 하나는 QMouseEvent이다. QMouseEvent 이벤트는 위젯의 모든 마우스 움직임과 버튼 클릭에 대해 생성된다. 마우스 이벤트를 처리하는 데 사용할 수 있는 이벤트 핸들러는 다음과 같다.

 

 

예를 들어, 위젯을 클릭하면 해당 위젯의 이벤트 핸들러 QMouseEvent로 전송된다. mousePressEvent이 핸들러는 이벤트 개체를 사용하여 이벤트를 트리거한 항목 및 발생한 특정 위치와 같은 발생한 상황에 대한 정보를 찾을 수 있다.

 

클래스의 핸들러 메서드를 하위 분류하고 재정의하여 이벤트를 가로챌 수 있다. super()로 상위 클래스 함수를 호출하여 이벤트를 필터링, 수정 또는 무시하고 이벤트에 대한 일반 핸들러로 전달할 수 있다. 다음과 같이 기본 창 클래스에 추가할 수 있다. 각각의 경우 e에 들어오는 이벤트를 받는다.

 

import sys

from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QTextEdit


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.label = QLabel("Click in this window")
        self.setCentralWidget(self.label)

    def mouseMoveEvent(self, e):
        self.label.setText("mouseMoveEvent")

    def mousePressEvent(self, e):
        self.label.setText("mousePressEvent")

    def mouseReleaseEvent(self, e):
        self.label.setText("mouseReleaseEvent")

    def mouseDoubleClickEvent(self, e):
        self.label.setText("mouseDoubleClickEvent")


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

 

마우스 이동 이벤트는 버튼을 눌렀을 때만 등록된다는 것을 알 수 있다. self.setMouseTracking(True) 창에서 호출하여 변경할 수 있다. 또한, 버튼을 눌렀을 때 누르기 (클릭) 및 두 번 클릭 이벤트가 모두 발생하는 것을 알 수 있다. 버튼을 놓을 때만 release 이벤트가 발생한다. 일반적으로 사용자의 클릭을 등록하려면 마우스 다운  릴리스를 모두 관찰해야 한다.

 

이벤트 핸들러 내에서 이벤트 객체에 액세스할 수 있다. 이 개체는 이벤트에 대한 정보를 포함하며 정확히 발생한 상황에 따라 다르게 응답하는 데 사용할 수 있다.

 

마우스 이벤트

 

Qt의 모든 마우스 이벤트 QMouseEvent는 다음 이벤트 메소드에서 읽을 수 있는 이벤트에 대한 정보와 함께 개체와 함께 추적된다.

 

 

이벤트 핸들러 내에서 이러한 메서드를 사용하여 다른 이벤트에 다르게 응답하거나 완전히 무시할 수 있다. 위치 메서드는 전역  로컬 (위젯 기준) 위치 정보를 QPoint 개체로 제공하는 반면, 버튼은 Qt 네임스페이스의 마우스 버튼 유형을 사용하여 보고된다.

 

예를 들어, 다음은 창에서 왼쪽, 오른쪽 또는 가운데 클릭에 다르게 응답할 수 있도록 한다.

 

    def mousePressEvent(self, e):
        if e.button() == Qt.LeftButton:
            # handle the left-button press in here
            self.label.setText("mousePressEvent LEFT")

        elif e.button() == Qt.MiddleButton:
            # handle the middle-button press in here.
            self.label.setText("mousePressEvent MIDDLE")

        elif e.button() == Qt.RightButton:
            # handle the right-button press in here.
            self.label.setText("mousePressEvent RIGHT")

    def mouseReleaseEvent(self, e):
        if e.button() == Qt.LeftButton:
            self.label.setText("mouseReleaseEvent LEFT")

        elif e.button() == Qt.MiddleButton:
            self.label.setText("mouseReleaseEvent MIDDLE")

        elif e.button() == Qt.RightButton:
            self.label.setText("mouseReleaseEvent RIGHT")

    def mouseDoubleClickEvent(self, e):
        if e.button() == Qt.LeftButton:
            self.label.setText("mouseDoubleClickEvent LEFT")

        elif e.button() == Qt.MiddleButton:
            self.label.setText("mouseDoubleClickEvent MIDDLE")

        elif e.button() == Qt.RightButton:
            self.label.setText("mouseDoubleClickEvent RIGHT")

 

버튼 식별자는 다음과 같이 Qt 네임스페이스에 정의된다.

 

728x90
반응형
LIST

'Python Library > PySide' 카테고리의 다른 글

[PySide] 위젯 (1)  (0) 2022.06.13
[PySide] Context menus  (0) 2022.06.13
[PySide] 위젯 연결하기  (0) 2022.06.13
[PySide] 인터페이스 변경  (0) 2022.06.13
[PySide] 신호 및 슬롯  (0) 2022.05.23