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
댓글