본문 바로가기
PyQt5_

Events

by 자동매매 2023. 3. 13.

10. Events

사용자가 Qt 응용 프로그램과 갖는 모든 상호 작용은 이벤트입니다.

여러 유형의 이벤트가 있으며 이벤트는 서로 다른 유형의 상호 작용을 나타냅니다.

Qt 일어난 일에 대한 정보를 패키지화하는 이벤트 객체를 사용하여 이러한 이벤트를 나타냅니다.

이러한 이벤트는 상호 작용이 발생한 위젯의 특정 이벤트 처리기로 전달됩니다.

사용자 지정 이벤트 처리기를 정의하면 위젯이 이러한 이벤트에 응답하는 방식을 변경할 있습니다.

이벤트 처리기는 다른 메서드와 마찬가지로 정의되지만 이름은 처리하는 이벤트 유형에 따라 다릅니다.

위젯이 수신하는 주요 이벤트 하나는 QMouseEvent 입니다. QMouseEvent 이벤트는 위젯의 모든 마우스 움직임과 버튼 클릭에 대해 생성됩니다. 다음 이벤트 처리기는 마우스 이벤트를 처리하는 사용할 있습니다.

 
Event handler Event type moved
mouseMoveEvent Mouse moved
mousePressEvent Mouse button pressed
mouseReleaseEvent Mouse button released
mouseDoubleClickEvent Double click detected
 
basic/events_1.py
import sys

from PyQt6.QtCore import Qt
from PyQt6.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)를 설정하여 마우스 추적기능 켜기 설정

 

Mouse events

 

Qt의 모든 마우스 이벤트는 QMouseEvent 객체로 추적되며 다음 이벤트 메서드에서 이벤트에 대한 정보를 읽을 수 있습니다. 

Method Returns
.button() Specific button that triggered this event
.buttons() State of all mouse buttons (OR’ed flags)
.position() Widget-relative position as a QPoint integer

 

basic/events_2.py

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow


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

    def mouseMoveEvent(self, e):
        pos = e.position()
        self.label.setText("mouseMoveEvent: %s" % (pos))

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

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

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

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

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

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

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

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

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

    # end::mousePressEvent[]


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

Identifier Value (binar y) Represents
Qt.MouseButtons.NoButton 0 (000) No button pressed, or the event is not related to button press.
Qt.MouseButtons.LeftButton 1 (001) The left button is pressed
Qt.MouseButtons.RightButton 2 (010) The right button is pressed.
Qt.MouseButtons.MiddleButton 4 (100) The middle button is pressed.

 

Context menus(오른마우스)

basic/events_3.py

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtGui import QAction
from PyQt6.QtWidgets import (
    QApplication,
    QLabel,
    QMainWindow,
    QMenu,
)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

    def contextMenuEvent(self, e):
        context = QMenu(self)
        context.addAction(QAction("test 1", self))
        context.addAction(QAction("test 2", self))
        context.addAction(QAction("test 3", self))
        context.exec(e.globalPos())


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

basic/events_4.py

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtGui import QAction
from PyQt6.QtWidgets import (
    QApplication,
    QLabel,
    QMainWindow,
    QMenu,
)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.show()

        self.setContextMenuPolicy(
            Qt.ContextMenuPolicy.CustomContextMenu
        )
        self.customContextMenuRequested.connect(self.on_context_menu)

    def on_context_menu(self, pos):
        context = QMenu(self)
        context.addAction(QAction("test 1", self))
        context.addAction(QAction("test 2", self))
        context.addAction(QAction("test 3", self))
        context.exec(self.mapToGlobal(pos))



app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

Event hierarchy

 

Python inheritance forwarding

Layout forwarding

 

'PyQt5_' 카테고리의 다른 글

Styles  (0) 2023.03.13
Qt Designer  (0) 2023.03.13
Windows  (0) 2023.03.13
Windows  (0) 2023.03.13
Dialogs  (0) 2023.03.13

댓글