How to install and use an Event Filter written in Qt C++ in a QML application -


i have situation need add keyboard shortcuts application comprised of qtquick user interface. version of qt quick unfortunately locked qt5.3 , shortcuts (the way need them) introduced in qt5.5 , qt5.7 respectively.

so, solution, wrote event filter functions qshortcut (can't use qshortcut, hence event filter).

does know how install , use eventfilter in qml?

one way expose singleton type qml:

#include <qtgui> #include <qtqml>  class shortcutlistener : public qobject {     q_object  public:     shortcutlistener(qobject *parent = nullptr) :         qobject(parent)     {     }      q_invokable void listento(qobject *object)     {         if (!object)             return;          object->installeventfilter(this);     }      bool eventfilter(qobject *object, qevent *event) override     {         if (event->type() == qevent::keypress) {             qkeyevent *keyevent = static_cast<qkeyevent*>(event);             qdebug() << "key" << keyevent->key() << "pressed on" << object;             return true;         }         return false;     } };  static qobject *shortcutlistenerinstance(qqmlengine *, qjsengine *engine) {     return new shortcutlistener(engine); }  int main(int argc, char *argv[]) {     qguiapplication app(argc, argv);      qmlregistersingletontype<shortcutlistener>("app", 1, 0, "shortcutlistener", shortcutlistenerinstance);      qqmlapplicationengine engine;     engine.load(qurl(qstringliteral("qrc:/main.qml")));      return app.exec(); }  #include "main.moc" 

main.qml:

import qtquick 2.5 import qtquick.window 2.2  import app 1.0  window {     id: window     width: 640     height: 480     visible: true      component.oncompleted: shortcutlistener.listento(window) } 

if have several different listeners, declaratively adding object property shortcutlistener install event filter on when set.

for more info, see integrating qml , c++.


Comments