Search code examples
c++qtpython-idleuser-inactivity

How to detect user inactivity in Qt?


How can I detect user inactivity in a Qt QMainWindow? My idea so far is to have a QTimer that increments a counter, which, if a certain value is passed, locks the application. Any mouse or key interaction should set the timer back to 0. However I need to know how to properly handle input events which reset; I can re-implement:

virtual void keyPressEvent(QKeyEvent *event)
virtual void keyReleaseEvent(QKeyEvent *event)
virtual void mouseDoubleClickEvent(QMouseEvent *event)
virtual void mouseMoveEvent(QMouseEvent *event)
virtual void mousePressEvent(QMouseEvent *event)
virtual void mouseReleaseEvent(QMouseEvent *event)

...but won't the event handlers of all the widgets in the QMainWindow prevent events occurring in those controls from reaching the QMainWindow's? Is there a better architecture for detecting user activity as it is?


Solution

  • You could use a custom event filter to process all keyboard and mouse events received by your application before they are passed on to the child widgets.

    class MyEventFilter : public QObject
    {
      Q_OBJECT
    protected:
      bool eventFilter(QObject *obj, QEvent *ev)
      {
        if(ev->type() == QEvent::KeyPress || 
           ev->type() == QEvent::MouseMove)
             // now reset your timer, for example
             resetMyTimer();
    
        return QObject::eventFilter(obj, ev);
      }
    }
    

    Then use something like

    MyApplication app(argc, argv);
    MyEventFilter filter;
    app.installEventFilter(&filter);
    app.exec();
    

    This definitely works (I've tried it myself).

    EDIT: And many thanks to ereOn for pointing out that my earlier solution was not very useful.