파이썬(Python)/PySide

[Python] PySide 마우스 이벤트 동작(Mouse event)

끄적끄적아무거나 2022. 11. 25. 09:06
반응형

 

목차

     

     

     

     

     

    파이썬 PySide 마우스 클릭 이벤트

    앞서 포스트의 내용처럼 마우스(Mouse) 설정을 class 내에서 진행하도록 하겠습니다. 마우스 관련 내용 이 외에 이해가 안되신다면 PySide 카테고리의 다른 글들을 보시면 쉽게 이해할 수 있습니다. 

     

    마우스 이벤트(Mouse event)는 QPushButton 함수에서 관리합니다. 우선 간단하게 아래에 마우스 클릭 시에 Hello 메세지를 전달하는 코드를 작성해보겠습니다. 마우스가 클릭하는 경우 인터럽트(Interrupt)가 발생해서 PySide GUI가 반응합니다.

     

     

     

    예제 코드>>

    from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
    from PySide6.QtCore import QSize
    import sys
    
    class Qt_Ex(QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.setWindowTitle("Qt Example")
            self.setFixedSize(QSize(250, 100))
            btn = QPushButton("버튼")
    
            btn.setCheckable(True)
            btn.clicked.connect(self.btn_clicked)
            self.setCentralWidget(btn)
    
        def btn_clicked(self):
            print("Hello")
    
    app = QApplication(sys.argv)
    
    window = Qt_Ex()
    window.show()
    
    app.exec()

     

     

    결과>>

    Hello
    Hello

     

     

    주석>>

            btn = QPushButton("버튼")
    
            btn.setCheckable(True)
            btn.clicked.connect(self.btn_clicked)
            self.setCentralWidget(btn)

    버튼 객체를 btn으로 생성하고 클릭(Click) 발생 시 클래스 내부의 btn_clicked라는 함수를 실행합니다. 

    setCheckable은 마우스를 체크 했는 지 여부를 True, False로 전달해주는 것을 결정하는 함수로 여기 예제에서는 사용안해도 됩니다.

     

     

     

     

     

     

    파이썬 PySide 마우스 이벤트 종류 및 기능

     

    이번에는 아래 이벤트에 대해 동작하는 코드를 알아 보겠습니다.

     

    • 마우스 클릭하고 움직이는 경우
    • 마우스 클릭한 경우
    • 마우스 클릭한 것 푼 경우
    • 마우스 더블 클릭 한 경우

     

    예제 코드로 쉽게 알아보겠습니다.

     

     

     

    예제 코드>>

    from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
    from PySide6.QtCore import QSize
    import sys
    
    class Qt_Ex(QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.setWindowTitle("Qt Example")
            self.setFixedSize(QSize(250, 100))
            self.label = QLabel("마우스 이벤트")
            self.setCentralWidget(self.label)
    
        def mouseMoveEvent(self, e):
            self.label.setText("mouseMoveEvent")
            print("mouseMoveEvent")
    
        def mousePressEvent(self, e):
            self.label.setText("mousePressEvent")
            print("mousePressEvent")
    
        def mouseReleaseEvent(self, e):
            self.label.setText("mouseReleaseEvent")
            print("mouseReleaseEvent")
    
        def mouseDoubleClickEvent(self, e):
            self.label.setText("mouseDoubleClickEvent")
            print("mouseDoubleClickEvent")
    
    
    app = QApplication(sys.argv)
    
    window = Qt_Ex()
    window.show()
    
    app.exec()

     

    결과>>

    mousePressEvent
    mouseReleaseEvent
    mousePressEvent
    mouseReleaseEvent
    mouseDoubleClickEvent
    mouseReleaseEvent
    mousePressEvent
    mouseReleaseEvent
    mousePressEvent
    mouseReleaseEvent
    mouseDoubleClickEvent
    mouseReleaseEvent
    mousePressEvent
    mouseMoveEvent
    mouseMoveEvent

     

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

    나머지 함수들도 이벤트(event) 성질에 따라 동작하고 구성은 동일하니 위 함수만 설명하겠습니다. event handler에서 이벤트를 주관하므로 위와 같이 함수 이름들을 정확하게 입력하여야 event 핸들러가 처리 합니다. 그리고 이벤트 발생을 함수의 e 로 전달 받습니다. 

     

    위와 같이 이벤트 발생 시 GUI의 라벨을 변경하고 print 문으로 어떤 이벤트가 발생했는지 기록하게 만들었습니다.

     

    핸들러 명 정의
    mouseMoveEvent 마우스 클릭 후 움질일 경우
    mousePressEvent 마우스 버튼 클릭
    mouseReleaseEvent 마우스 버튼 클릭 해제
    mouseDoubleClickEvent 마우스 더블 클릭

     

     

     

     

     

    파이썬 PySide 마우스 오른쪽, 왼쪽 , 가운데 버튼 인식

     

    앞서 코드는 마우스의 오른쪽 왼쪽 가운데(휠) 버튼에 관계없이 클릭이나 해제를 인식하였습니다. 아래 예제 코드는 버튼의 위치에 따라 인식하는 방법입니다. 별도의 주석 없이 충분이 이해가 될 것으로 생각해서 코드만 남겨 놓겠습니다.

     

    예제 코드>>

    from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
    from PySide6.QtCore import QSize, Qt
    import sys
    
    class Qt_Ex(QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.setWindowTitle("Qt Example")
            self.setFixedSize(QSize(250, 100))
            self.label = QLabel("마우스 이벤트")
            self.setCentralWidget(self.label)
    
        def mousePressEvent(self, e):
            if e.button() == Qt.LeftButton:
                print("Press_Left")
            elif e.button() == Qt.MiddleButton:
                print("Press_Middle")
            elif e.button() == Qt.RightButton:
                print("Press_Right")
    
        def mouseReleaseEvent(self, e):
            if e.button() == Qt.LeftButton:
                print("Release_Left")
            elif e.button() == Qt.MiddleButton:
                print("Release_Middle")
            elif e.button() == Qt.RightButton:
                print("Release_Right")
    
    app = QApplication(sys.argv)
    
    window = Qt_Ex()
    window.show()
    
    app.exec()

     

     

     

    결과>>

    Press_Left
    Release_Left
    Press_Right
    Release_Right
    Press_Middle
    Release_Middle

     

    반응형