シンプルなイベント処理

Tips,PySide,PySide2,Python,Qt,Maya

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()