본문으로 바로가기
반응형

QWidget 을 상속받은 모든 위젯은 마우스 동작과 관련된 콜백 이벤트를 받을 수 있습니다. 해당 클래스에는 virtual 함수가 있기 때문에 QWidget 의 가상 함수를 Overried 해서 만듭니다. 함수의 파라미터로 전달받은 QMouseEvent 객체에는 모든 마우스 관련 정보들이 들어가 있습니다.

 

내가 사용할 수 있는 가상함수에는 어떤 것들이 있는지 알아보고 싶다면 PyQt5 사이트로 가서 QWidget Virtual void 함수를 찾습니다. 그림처럼 마우스와 관련된 가상함수는 4개가 있네요. 이번 포스팅에서는 마우스클릭에 해당하는 mousePressEvent() 와 마우스의 움직임이 있을 때 마다 정보를 받을 수 있는 mouseMoveEvent() 그리고 마우스 휠 동작을 감지할 수 있는 wheelEvent() 가상함수에 대해 알아보겠습니다.

 

1. 화면에서의 마우스 포인트 정보 수신

 

먼저 정보를 표시할 상태바를 추가합니다.

# 화면에 상태바 추가
self.status_bar = self.statusBar()

 

다음은 마우스 동작감지를 위한 가상함수인 mouseMoveEvent() 를 추가합니다. 파라미터 정보로 받은 QMouseEvent 객체를 이용해서 현재 마우스 포인트의 좌표 정보를 화면 하단 상태바에 나타냅니다. 좌표정보는 2가지로 구분할 수 있습니다. 프로그램 윈도우 화면을 기준으로 한 좌표와 모니터를 기준으로 한 마우스 좌표 정보입니다. 모니터를 기준으로 한 좌표값은 globalX() globalY() 로 알 수 있습니다.

def mouseMoveEvent(self, event):
    mouse_pt = "Mouse Point : x={0},y={1}, global={2},{3}".format(event.x(), event.y(), event.globalX(), event.globalY())
    self.status_bar.showMessage(mouse_pt)

 

2. 마우스 클릭 이벤트 구분해서 출력하기

 

마우스 클릭과 관련된 함수는 mousePressEvent() 입니다. 해당 함수로 마우스에 있는 3가지 버튼 중에서 어떤 것을 클릭했는지 구분할 수 있습니다.

from PyQt5.QtCore import Qt

# 마우스 클릭 구분
def mousePressEvent(self, event):
    if event.buttons() & Qt.LeftButton:
        print('LEFT')
    if event.buttons() & Qt.MidButton:
        print('MIDDLE')
    if event.buttons() & Qt.RightButton:
        print('RIGHT')

 

그림처럼 화면에 마우스를 클릭하면 콘솔에 어떤 버튼을 눌렀는지 출력됩니다.

 

mousePressEvent() 함수의 파라미터인 QEvent 는 다양한 타입이 있습니다. 아래 주소로 접속하시면 마우스 이벤트 타입을 구분할 수 있는 키들을 확인할 수 있습니다. C++ 메뉴얼이지만 PyQt5 에서도 동일하게 사용이 가능합니다.

https://doc.qt.io/qt-5/qt.html#MouseButton-enum

 

3. 마우스 휠 이벤트 받기

 

마우스 휠 감지를 위한 가상함수는 wheelEvent() 이며, 파라미터로 전달받은 QMouseEvent 객체로 값을 출력합니다. 마우스 휠 값은 수평과 수직을 기준으로 해서 델타 각도를 나타냅니다. 각도의 최대값은 120 도로 보통의 마우스는 8 등분해서 15도 단위로 움직입니다. 일반 마우스는 수평으로 움직일 수 없기 때문에 x값은 0 이고 y 좌표값은 120를 최대값으로 양수와 음수가 나타납니다. 양수는 위이고 음수면 아래로 휠을 내린 상태입니다.  

# 마우스 휠 구분
def wheelEvent(self, event):
    print('wheel')
    print('(%d %d)' % (event.angleDelta().x(), event.angleDelta().y()))

반응형