python 3+PyQt 5 QT 이벤트 처리 프로그램 재 구현
주:컨 텍스트 메뉴 를 만 드 는 가장 쉬 운 방법 으로 Qwidget.addAction()을 사용 하여 창 위 젯 에 동작 을 추가 한 다음,창 위 젯 의 컨 텍스트 메뉴 정책 을 Qt.ActionsContextMenu 로 설정 하면 되 지만,이 예 와 같이 서로 다른 상태 에 따라 옵션 을 제공 하려 면 컨 텍스트 메뉴 이벤트 처리 프로그램 을 다시 구현 해 야 합 니 다.
#!/usr/bin/env python3
import sys
from PyQt5.QtCore import (QEvent, QTimer, Qt)
from PyQt5.QtWidgets import (QApplication, QMenu, QWidget)
from PyQt5.QtGui import QPainter
class Widget(QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.justDoubleClicked = False
self.key = ""
self.text = ""
self.message = ""
self.resize(400, 300)
self.move(100, 100)
self.setWindowTitle("Events")
QTimer.singleShot(0, self.giveHelp) # Avoids first resize msg
def giveHelp(self):
self.text = "Click to toggle mouse tracking"
self.update()
def closeEvent(self, event):
print("Closed")
def contextMenuEvent(self, event):
menu = QMenu(self)
oneAction = menu.addAction("&One")
twoAction = menu.addAction("&Two")
oneAction.triggered.connect(self.one)
twoAction.triggered.connect(self.two)
if not self.message:
menu.addSeparator()
threeAction = menu.addAction("Thre&e")
threeAction.triggered.connect(self.three)
menu.exec_(event.globalPos())
def one(self):
self.message = "Menu option One"
self.update()
def two(self):
self.message = "Menu option Two"
self.update()
def three(self):
self.message = "Menu option Three"
self.update()
def paintEvent(self, event):
text = self.text
i = text.find("
")
if i >= 0:
text = text[0:i]
if self.key:
text += "
You pressed: {0}".format(self.key)
painter = QPainter(self)
painter.setRenderHint(QPainter.TextAntialiasing)
painter.drawText(self.rect(), Qt.AlignCenter, text)
if self.message:
painter.drawText(self.rect(), Qt.AlignBottom|Qt.AlignHCenter,
self.message)
QTimer.singleShot(5000, self.clearMessage)
QTimer.singleShot(5000, self.update)
def clearMessage(self):
self.message=""
def resizeEvent(self, event):
self.text = "Resized to QSize({0}, {1})".format(
event.size().width(), event.size().height())
self.update()
def mouseReleaseEvent(self, event):
if self.justDoubleClicked:
self.justDoubleClicked = False
else:
self.setMouseTracking(not self.hasMouseTracking())
if self.hasMouseTracking():
self.text = "Mouse tracking is on.
"+\
"Try moving the mouse!
"+\
"Single click to switch it off"
else:
self.text = "Mouse tracking is off.
"+\
"Single click to switch it on"
self.update()
def mouseMoveEvent(self, event):
if not self.justDoubleClicked:
globalPos = self.mapToGlobal(event.pos())
self.text = "The mouse is at
QPoint({0}, {1}) "+\
"in widget coords, and
"+\
"QPoint({2}, {3}) in screen coords".format(
event.pos().x(), event.pos().y(), globalPos.x(),
globalPos.y())
self.update()
def mouseDoubleClickEvent(self, event):
self.justDoubleClicked = True
self.text = "Double-clicked."
self.update()
def keyPressEvent(self, event):
self.key = ""
if event.key() == Qt.Key_Home:
self.key = "Home"
elif event.key() == Qt.Key_End:
self.key = "End"
elif event.key() == Qt.Key_PageUp:
if event.modifiers() & Qt.ControlModifier:
self.key = "Ctrl+PageUp"
else:
self.key = "PageUp"
elif event.key() == Qt.Key_PageDown:
if event.modifiers() & Qt.ControlModifier:
self.key = "Ctrl+PageDown"
else:
self.key = "PageDown"
elif Qt.Key_A <= event.key() <= Qt.Key_Z:
if event.modifiers() & Qt.ShiftModifier:
self.key = "Shift+"
self.key += event.text()
if self.key:
self.key = self.key
self.update()
else:
QWidget.keyPressEvent(self, event)
def event(self, event):
if (event.type() == QEvent.KeyPress and
event.key() == Qt.Key_Tab):
self.key = "Tab captured in event()"
self.update()
return True
return QWidget.event(self, event)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Widget()
form.show()
app.exec_()
실행 결과:이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Jupyter 공식 DockerHub에 대한 메모에 기재되어 있다. base-notebook minimal-notebook scipy-notebook tensorflow-notebook datascience-notebook pyspark-notebook all-s...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.