シンプルなイベント処理

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に組み込んでみてください。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys

import maya.cmds as cmds
import pymel.core as pm
from maya import OpenMayaUI

from Qt.QtWidgets import *
from Qt.QtGui import *
from Qt.QtCore import *

try:
   import shiboken
except:
   import shiboken2 as shiboken


ptr = OpenMayaUI.MQtUtil.mainWindow()
parent = shiboken.wrapInstance(long(ptr), QWidget)


class SetEventWindow(QMainWindow):
    def __init__(self):
        super(SetEventWindow, self).__init__(parent)

    def closeEvent(self, event):
        print "coloseWindow"

    def resizeEvent(self, event):
        ex = Example_UI_ex
        print "resize width:%s height:%s" % (ex.width(), ex.height())

    def hideEvent(self, event):
        print "hide"

    def enterEvent(self, event):
        print "enter"

    def leaveEvent(self, event):
        print "leave"

    def showEvent(self, event):
        print "show"

class drapEventWindow(SetEventWindow):
    def __init__(self):
        super(drapEventWindow, self).__init__()

    def dragEnterEvent(self, event):
        event.accept()
        print('dragEnterEvent')

    def dragLeaveEvent(self, event):
        event.accept()
        print('dragLeaveEvent')

    def dragMoveEvent(self, event):
        event.accept()
        print('dragMoveEvent')

    def dropEvent(self, event):
        event.accept()
        print('dropEvent')

class keyEventWindow(drapEventWindow):
    def __init__(self):
        super(keyEventWindow, self).__init__()


    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Q:
            print "keyPressEvent"
        event.accept()
    def keyReleaseEvent(self, event):
        if event.key() == Qt.Key_Q:
            print "keyReleaseEvent"
        event.accept()

class mouseEventWindow(keyEventWindow):
    def __init__(self):
        super(mouseEventWindow, self).__init__()

    def mouseDoubleClickEvent(self, event):
        print "mouseDoubleClick"

    def mouseMoveEvent(self, event):
        print "mouseMove"

    def mousePressEvent(self, event):
        print "mousePress"

    def mouseReleaseEvent(self, event):
        print "mouseRelease"

    def moveEvent(self, event):
        ex = Example_UI_ex
        print "move x:%s y:%s" % (ex.pos().x(), ex.pos().y())


class MyLineEdit(QLineEdit):
    def __init__(self):
        super(MyLineEdit, self).__init__()

    def focusInEvent(self, event):
        self.selectAll()
        print "focusInEvent"

    def focusNextPrevChild(self, event):
        self.selectAll()
        print "focusNextPrevChild"

    def focusOutEvent(self, event):
        self.selectAll()
        print "focusOutEvent"

class Gui(QWidget):
    def __init__(self):
        super(Gui, self).__init__()
        self.btn = QPushButton("resize", self)
        self.btn.setMinimumWidth(50)
        self.line1 = MyLineEdit()
        self.line2 = MyLineEdit()
        layout = QVBoxLayout(self)
        layout.addWidget(self.btn)
        layout.addWidget(self.line1)
        layout.addWidget(self.line2)
        self.btn.clicked.connect(self.resizeWindow)

    def resizeWindow(self):
        ex = Example_UI_ex
        width = ex.width()
        geo = self.geometry()
        if width == 200:
            Example_UI_ex.resize(600, 300)
        else:
            Example_UI_ex.resize(200, 300)


class Example(mouseEventWindow):
    def __init__(self):
        super(Example, self).__init__()
        self.setCentralWidget(Gui())
        self.setWindowTitle('Example') 
        self.resize(200, 300) 
        self.move(400, 400) 
        # ドロップ許可
        self.setAcceptDrops(True)

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update)
        self.timer.start(100)
        self.frameGeometry()\
            .moveCenter(
                        QDesktopWidget()
                        .availableGeometry()
                        .center()
                        )
        self.x = 0
        self.y = 5

    def paintEvent(self, QPaintEvent):
        painter = QPainter(self)
        painter.setPen(Qt.black)
        painter.setBrush(Qt.red)
        self.x += 1
        if self.x > 120:
            self.x = 0
        elif self.x % 20 == 0:
            print "paintEvent x:%s" % self.x
        painter.drawRect(self.x, self.y, 10, 10)


def Example_UI():
    global Example_UI_ex
    app = QApplication.instance()
    Example_UI_ex = Example()
    Example_UI_ex.show()
    sys.exit()
    app.exec_()
Example_UI()