PyQt Event サンプル

#encoding:utf-8
import sys
from PyQt4 import QtGui

class Example(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.setAcceptDrops(True)
        self.resize(150, 150)
        self.setWindowTitle("D&D")
        lineEdit(self)
        self.show()
    def dragEnterEvent(self, e):
        if e.mimeData().hasUrls():
            e.accept()
        else:
            e.ignore()
    def dropEvent(self, e):
        print("\n".join(u.toLocalFile() for u in e.mimeData().urls()))
    def moveEvent(self,e):
        print("move="+str(e.oldPos().x())
            +"_"+str(e.oldPos().y())
            +":"+str(e.pos().x())
            +"_"+str(e.pos().y()))
    def resizeEvent(self,e):
        print("resize="+str(e.oldSize().height())
            +"_"+str(e.oldSize().width())
            +":"+str(e.size().height())
            +"_"+str(e.size().width()))

    def showEvent(self,e):
        print("show:"+str(e.spontaneous()))
    def wheelEvent(self,e):
        print("wheel="+str(e.delta()/8)
            +"_"+str(e.orientation())
            +":"+str(e.x())
            +"_"+str(e.y()))
    def mouseMoveEvent(self,e):
        print("mouseMove="+bin(int(e.buttons())))


class lineEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(lineEdit, self).__init__(parent)
        self.move(30,30)
    def keyPressEvent(self,e):
        super(lineEdit,self).keyPressEvent(e)
        print("text="+e.text()
            +",count="+str(e.count()))
            +",key="+hex(e.key())
            +",Modifiers="+hex(int(e.modifiers()))
            +",nativeVK="+str(e.nativeVirtualKey())
            +",nativeScanCode="+str(e.nativeScanCode())
            +",nativeModifiers="+bin(e.nativeModifiers())
            +",isAutoRepeat="+str(e.isAutoRepeat())
            +",matches="
                +str(e.matches(QtGui.QKeySequence.Copy))

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

dragEnterEvent (QDragEnterEvent)

ドラッグしているマウスがこのウィジットに入ってきた時動く。
このイベントが無視されるときdragMoveEventも受け取らない。
eの中は

QPoint e.mimeData()
QMimeData e.pos()
Qt.MouseButtons e.mouseButtons()
Qt.KeyboardModifiers e.keyboardModifiers()

dragLeaveEvent (QDragLeaveEvent)

ドラッグして一旦ウィジットに入ったものがそのままドロップされず領域外でドロップされた時呼ばれる

dragMoveEvent (QDragMoveEvent)

ドラッグした状態でこのウィジットの上でマウスが動いているとき呼ばれる。eの中はだいたいdragEnterEventと同じ

dropEvent (QDropEvent)

名前の通り。eの中はdragEnterEventに
QWidget e.sourceが追加されたくらい。これはドラッグ元がこのアプリケーションの場合そのドラッグ元のウィジット自体を返すみたい。

enterEvent (QEvent)

マウスカーソルがウィジット内に入った時に呼ばれる

leaveEvent (QEvent)

マウスカーソルがウィジットを離れた時に呼ばれる

mouseMoveEvent mouseDoubleClickEvent mouseReleaseEvent mousePressEvent (QMouseEvent)

マウストラッキングのスイッチがオフの場合いずれかのマウスボタンが押されている場合しかmouseMoveEventは発生しないマウストラッキングがオンになっているとボタンが押されていなくてもイベントが発生する。
マウスを動かしている間にツールチップを追随させるにははじめにマウストラッキングを許可する。setToolTip()ではなくQToolTip.showText()を呼ぶとより確かに追随できる。

Qt.MouseButton e.button()
イベントを引き起こしたボタンを返す。mouseMoveEventにはいつもQt.NoButtonを返す
Qt.MouseButtons e.buttons()
イベントが呼ばれた時のボタンの状態を返す。参考:Qt.MouseButton
QPoint e.globalPos()
非同期性のウィンドウシステム(X11のような)では現在のマウスの位置(QCursor.pos())とイベント発生した位置が違ってしまうため必要とか何とか
int e.globalX()
int e.globalY()
bool e.hasExtendedInfo()
QPoint e.pos()
ハンドシェイクしたときは反応が追いつかないかもしれないけどそれはQtの所為ではなくウィンドウシステムに由来するもの。
int e.x()
int e.y()
QPOintF e.posF()

closeEvent (QCloseEvent)

ウィンドウを閉じるとき呼ばれる。

moveEvent (QMoveEvent)

ウィジットが(例えばウィンドウを動かしたりして)動き、移動し終わった時に呼ばれる。座標は動き始めと動き終わりしかわからない。

QPoint e.pos()
QPoint e.oldPos()

resizeEvent (QResizeEvent)

ウィジットがリサイズし、そしてし終わった時に呼ばれる。

Qsize e.oldSize()
Qsize e.size()

showEvent (QShowEvent)

self.show()した時呼ばれる。あと最小化して仕舞ってあったウィンドウを復元した時も呼ばれる。どちらなのかはe.spontaneous()で分かる

hideEvent (QHideEvent)

self.hide()した時以下ほぼ同文

childEvent (QChildEvent)

wheelEvent (QWheelEvent)

int e.delta()
ホイールの回された変化量を返す。度数法で表す場合8で割る。大抵のマウス(所謂ぬるぬるホイールではない物)は15度ずつ回る(らしい)ので、ひとつのステップはe.delta()/90で表される。
QPoint e.globalPos()
int e.globalX()
int e.globalY()
非同期性のウィンドウシステム(X11のような)では現在のマウスの位置(QCursor.pos())とイベント発生した位置が違ってしまうため必要とか何とか
Qt.Orientation e.orientation()
ホイールの回る向き(上下か左右か)
QPoint e.pos()
int e.x()
int e.y()

focusOutEvent

focusInEvent

keyPressEvent (QKeyEvent) keyReleaseEvent (QKeyEvent)

前提として当然ウィジットへのフォーカスが許可されていなければならない。(でないと文字入力ができない)

Qt.KeyboardModifiers e.modifiers()
必ずしもこの関数は正しくはない。(2つのShiftキーを押し、片方だけ離すなど)混乱させることが出来る
int e.count()
int e.key()
押されたキーのコード(Qt.Key参照)を返す。この関数は大文字と小文字を区別しない。そういう場合はe.text()を使う
int e.nativeModifiers()
int e.nativeScanCode()
MacではCarbon,Cocoaからはスキャンコードを取れないので使えない。(いつも1か0が返ってくる)
int e.nativeVirtualKey()
QString e.text()
実際に入力される文字を返す。Modifierキーが押されていると表示されなかったりする。その場合でもe.key()はちゃんと値を含んでいる
bool e.matches(QKeySequence.StandardKey key)
文字列のコピーなどの指定の操作があった場合Trueを返す
bool e.isAutoRepeat()
名前通り