Как обнаружить неактивность пользователя в Qt? - PullRequest
5 голосов
/ 27 июля 2010

Как я могу обнаружить неактивность пользователя в Qt QMainWindow?Моя идея до сих пор состоит в том, чтобы иметь QTimer, который увеличивает счетчик, который, если передается определенное значение, блокирует приложение.Любое взаимодействие с мышью или клавишей должно установить таймер обратно на 0. Однако мне нужно знать, как правильно обрабатывать события ввода, которые сбрасываются;Я могу повторно реализовать:

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)

... но не будут ли обработчики событий всех виджетов в QMainWindow предотвращать события, происходящие в этих элементах управления, до достижения QMainWindow?Есть ли лучшая архитектура для определения активности пользователей?

Ответы [ 2 ]

9 голосов
/ 27 июля 2010

Вы можете использовать пользовательский фильтр событий для обработки всех событий клавиатуры и мыши, полученных вашим приложением, прежде чем они будут переданы дочерним виджетам.

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);
  }
}

Тогда используйте что-то вроде

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

Это определенно работает (я сам пробовал).

РЕДАКТИРОВАТЬ: И большое спасибо ereOn за указание, что мое предыдущее решение было не очень полезным.

0 голосов
/ 05 февраля 2011

Один из лучших подходов - поймать сигнал xidle, а не поймать столько событий от пользователя. Здесь нужно захватить событие QEvent: MouseMove также

...