Qt QuickでQMLなアプリを書いているとき、MouseAreaだけではマウスイベントを満足に捕捉できなくなりました。
※前回の記事とほとんどかぶってます。
たとえば、ウィンドウの端にマウスが到達したらイベントを発生させたいけれど、その下にボタンがあるのでイベントを横取りして欲しくない、などです。
# my_application.h
class my_application : public Application {
Q_OBJECT
public:
explicit my_application(int &argc, char **argv);
protected:
virtual bool eventFilter(QObject *obj, QEvent *event);
};
# my_application.cpp
bool my_application::eventFilter(QObject *obj, QEvent *event) {
if (event->type() == QEvent::MouseMove) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *> (event);
QPointF pos = mouseEvent->windowPos();
// qmlRegisterType + setContextPropertyを使用してC++とQMLを
// 連動させれば、QMLにイベントを渡せる。
/* Fall through */
}
return QObject::eventFilter(obj, event);
}
これで無事に全体のマウスイベントをとれました。
EventFilterは協力なので、あまりやると「何でQML使ってるんだっけ?」となるのでほどほどに。