シンプルなイベント処理
Qtにはデフォルトで組み込まれているイベント処理がいくつかあります。
今回はそのイベント処理をとにかく入れたコードを作りました。
用意されている関数でよく使うもの
virtual関数 | 発生要因 |
---|---|
closeEvent(QCloseEvent *event) | ウインドウを閉じた |
showEvent(QShowEvent *event) | 表示された |
hideEvent(QHideEvent *event) | 非表示になった |
resizeEvent(QResizeEvent *event) | サイズ変更された |
enterEvent(QEvent *event) | カーソルが中に入った |
leaveEvent(QEvent *event) | カーソルが外に出た |
dragEnterEvent(QDragEnterEvent *event) | ドラッグカーソルが入った |
dragLeaveEvent(QDragLeaveEvent *event) | ドラッグカーソルが出た |
dragMoveEvent(QDragMoveEvent *event) | ドラッグカーソルが動いた |
dropEvent(QDropEvent *event) | ドロップした |
keyPressEvent(QKeyEvent *event) | キーを押した |
keyReleaseEvent(QKeyEvent *event) | キーを離した |
mouseDoubleClickEvent(QMouseEvent *event) | ダブルクリックした |
mouseMoveEvent(QMouseEvent *event) | カーソルが移動した |
mousePressEvent(QMouseEvent *event) | マウスボタンを押した |
mouseReleaseEvent(QMouseEvent *event) | マウスボタンを離した |
moveEvent(QMoveEvent *event) | オブジェクトが移動した |
focusInEvent(QFocusEvent *event) | フォーカスを持った |
focusNextPrevChild(bool next) | フォーカスが移った |
focusOutEvent(QFocusEvent *event) | フォーカスを失った |
paintEvent(QPaintEvent *event) | 再描画された |
コードをコピーしてmayaで実行すると確認できます。
実行するとscriptEditor内に今実行されているイベントがプリントされます
LineEidtをtabkeyで移動すればfocusNextPrevChildというイベントがプリントされますし
Qkeyを押すとkeyPressEvent、Qkeyを離すとkeyReleaseEventなどなど
詳しい説明は今回はしていませんがいろいろ見て試して、自分のscriptに組み込んでみてください。
import sys
from maya import OpenMayaUI
from PySide2 import QtGui, QtCore, QtWidgets
from shiboken2 import wrapInstance
ptr = OpenMayaUI.MQtUtil.mainWindow()
parent = wrapInstance(int(ptr), QtWidgets.QWidget)
def check_domain(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print(f"Function: {func.__name__}")
return result
return wrapper
class MyLineEdit(QtWidgets.QLineEdit):
def __init__(self, parent=None):
super(MyLineEdit, self).__init__(parent)
@check_domain
def focusInEvent(self, event):
self.selectAll()
super().focusInEvent(event)
@check_domain
def focusNextPrevChild(self, event):
self.selectAll()
super().focusNextPrevChild(event)
@check_domain
def focusOutEvent(self, event):
self.selectAll()
super().focusOutEvent(event)
class Gui(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Gui, self).__init__(parent)
self.btn = QtWidgets.QPushButton("resize", self)
self.btn.setMinimumWidth(50)
self.line1 = MyLineEdit()
self.line2 = MyLineEdit()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.btn)
layout.addWidget(self.line1)
layout.addWidget(self.line2)
self.btn.clicked.connect(self.resizeWindow)
@check_domain
def resizeWindow(self):
width = self.parent().width()
geo = self.geometry()
if width == 200:
self.parent().resize(600, 300)
else:
self.parent().resize(200, 300)
class SimpleEventWindow(QtWidgets.QMainWindow):
x:int = 0
y:int = 5
def __init__(self, parent=None):
super(SimpleEventWindow, self).__init__(parent)
self.setCentralWidget(Gui(self))
self.setWindowTitle('Example')
self.resize(200, 300)
self.move(400, 400)
self.setAcceptDrops(True)
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.update)
self.timer.start(100)
self.frameGeometry().moveCenter(
QtWidgets.QDesktopWidget().availableGeometry().center()
)
@check_domain
def closeEvent(self, event):
super().closeEvent(event)
@check_domain
def resizeEvent(self, event):
print(f"resize width:{self.width()} height:{self.height()}")
super().resizeEvent(event)
@check_domain
def hideEvent(self, event):
super().hideEvent(event)
@check_domain
def enterEvent(self, event):
super().enterEvent(event)
@check_domain
def leaveEvent(self, event):
super().leaveEvent(event)
@check_domain
def showEvent(self, event):
super().showEvent(event)
@check_domain
def dragEnterEvent(self, event):
event.accept()
super().dragEnterEvent(event)
@check_domain
def dragLeaveEvent(self, event):
event.accept()
super().dragLeaveEvent(event)
@check_domain
def dragMoveEvent(self, event):
event.accept()
super().dragMoveEvent(event)
@check_domain
def dropEvent(self, event):
event.accept()
super().dropEvent(event)
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Q:
print("keyPressEvent: Q")
event.accept()
def keyReleaseEvent(self, event):
if event.key() == QtCore.Qt.Key_Q:
print("keyReleaseEvent: Q")
event.accept()
@check_domain
def mouseDoubleClickEvent(self, event):
super().mouseDoubleClickEvent(event)
@check_domain
def mouseMoveEvent(self, event):
super().mouseMoveEvent(event)
@check_domain
def mousePressEvent(self, event):
super().mousePressEvent(event)
@check_domain
def mouseReleaseEvent(self, event):
super().mouseReleaseEvent(event)
@check_domain
def moveEvent(self, event):
print(f"move x:{self.pos().x()} y:{self.pos().y()}")
def paintEvent(self, QPaintEvent):
painter = QtGui.QPainter(self)
painter.setPen(QtCore.Qt.black)
painter.setBrush(QtCore.Qt.red)
self.x += 1
if self.x > 120:
self.x = 0
elif self.x % 20 == 0:
print(f"paintEvent x:{self.x}")
painter.drawRect(self.x, self.y, 10, 10)
def Example_UI():
ex = SimpleEventWindow(parent)
ex.show()
Example_UI()
ディスカッション
コメント一覧
まだ、コメントがありません