シンプルなイベント処理
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()
ディスカッション
コメント一覧
まだ、コメントがありません