2010-07-27 70 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事件

相關問題