2010-07-27 13 views
5

Come posso rilevare l'inattività dell'utente in una Qt QMainWindow? La mia idea è di avere un QTimer che incrementa un contatore, che, se viene passato un determinato valore, blocca l'applicazione. Qualsiasi interazione con il mouse o il tasto dovrebbe riportare il timer su 0. Tuttavia, ho bisogno di sapere come gestire correttamente gli eventi di input che si resettano; Posso re-implementare:Come rilevare l'inattività dell'utente in 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) 

... ma i gestori di eventi di tutti i widget nella QMainWindow non impedirà eventi che si verificano in quei controlli di raggiungere la QMainWindow del? Esiste un'architettura migliore per rilevare l'attività degli utenti così com'è?

risposta

7

È possibile utilizzare un filtro eventi personalizzato per elaborare tutti gli eventi di tastiera e mouse ricevuti dall'applicazione prima che vengano trasferiti ai widget secondari.

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

Quindi utilizzare qualcosa come

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

Questo funziona sicuramente (ho provato io stesso).

EDIT: E molte grazie a ereOn per aver sottolineato che la mia soluzione precedente non era molto utile.

+0

Funziona alla grande, grazie. Ho finito per emettere un segnale con il parametro obj in cui hai "resetMyTimer" e ogni finestra ha collegato il segnale al suo slot del timer di reset, che controlla se un widget su * that * ha generato l'evento in modo che ogni finestra si blocchi in modo indipendente degli altri. –

+0

L'evento sembra essere solo inviato a eventFilter() se nessuno dei widget figli gestisce l'evento. C'è un modo per garantire che tutti gli eventi vadano a questo filtro prima di essere elaborati altrove? – KyleL

0

Uno degli approcci migliori sarà catturare il segnale xidle piuttosto che catturare così tanti eventi da parte dell'utente. Qui è necessario acquisire QEvent: evento MouseMove anche