pyqt4 の widget に マウスなイベントハンドラを追加する

qt では QLineEdit などの QWidget に デフォルトではマウスなイベントハンドラがないらしい。なので、clicked, pressed, released などを connect しても無反応です。もし、デフォルトの QWidget にマウスなイベントハンドラーを追加したい場合は、本家 ML に Widget のサブクラスを作ってフックしろとあった。

from PyQt4 import QtCore, QtGui

class QLineEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        QtGui.QLineEdit.__init__(self, parent)

    def mousePressEvent(self, event):
        self.emit(QtCore.SIGNAL("pressed()"))

    def mouseReleaseEvent(self, event):
        self.emit(QtCore.SIGNAL("clicked()"))
        self.emit(QtCore.SIGNAL("released()"))

乱暴ですが、上記のコードでデフォルトのイベントをハンドリングできます。 clicked については Press と Release を両方フックする必要があると書いてありましたけど、いつどこで押されて、何秒以内に離されたかとか厳密に制御されたい型は実装しちゃってください(笑

他にも Qt では、デフォルトのイベントで渡ってくる情報が少なかったりするので、サブクラスでフックしちゃってます。

コメント

このブログの人気の投稿

Python から Win32 API 経由で印刷する

財務諸表 (Financial Statements)

Django と Python 3 - #python_adv