2010-07-27 88 views
5

如何检测用户在Qt QMainWindow中的不活动?我的想法到目前为止是有一个QTimer递增计数器,如果通过一个特定的值,锁定应用程序。任何鼠标或键交互都应该将定时器设置回0.但是我需要知道如何正确处理重置的输入事件;我可以重新实现:如何检测用户在Qt中的不活动?

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在这些控件中发生的事件?是否有更好的架构来检测用户活动?

回答

7

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

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

很好,谢谢。我最终发出了一个带有obj参数的信号,其中有“resetMyTimer”,并且每个窗口都将信号附加到其复位计时器插槽,该插槽检查*窗口上的窗口小部件是否生成事件,以便每个窗口独立锁定的其他人。 – 2010-07-28 03:21:43

+0

如果没有任何子部件处理所述事件,则该事件似乎只发送给eventFilter()。有没有办法确保所有事件在进行其他处理之前都会转到此过滤器? – KyleL 2014-09-24 16:17:04

0

更好的方法之一是捕捉西德尔信号,而不是从用户那里捕捉这么多事件。这里需要捕捉QEvent:MouseMove事件