5

如何在 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 吗?是否有更好的架构来检测用户活动?

4

2 回答 2

11

您可以使用自定义事件过滤器来处理应用程序接收到的所有键盘和鼠标事件,然后再将它们传递给子小部件。

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 指出我之前的解决方案不是很有用。

于 2010-07-27T08:32:01.687 回答
0

一种更好的方法是捕获 xidle 信号,而不是从用户那里捕获这么多事件。这里还需要捕获 QEvent:MouseMove 事件

于 2011-02-05T18:55:08.273 回答