2010-07-27 18 views
5

¿Cómo puedo detectar la inactividad del usuario en Qt QMainWindow? Mi idea hasta ahora es tener un QTimer que incremente un contador, que, si se pasa un cierto valor, bloquea la aplicación. Cualquier interacción con el mouse o la tecla debería establecer el temporizador en 0. Sin embargo, necesito saber cómo manejar adecuadamente los eventos de entrada que se restablecen; Puedo volver a implementar:¿Cómo detectar la inactividad del usuario en 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) 

... pero no a los controladores de eventos de todos los widgets en la QMainWindow prevenir los eventos que ocurren en los controles de llegar a la QMainWindow de? ¿Hay una mejor arquitectura para detectar la actividad del usuario tal como es?

Respuesta

7

Puede usar un filtro de eventos personalizado para procesar todos los eventos de teclado y mouse recibidos por su aplicación antes de que se pasen a los widgets secundarios.

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

A continuación, utilice algo como

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

Esto funciona definitivamente (he probado a mí mismo).

EDIT: Y muchas gracias a ereOn por señalar que mi solución anterior no fue muy útil.

+0

Funciona muy bien, gracias. Terminé emitiendo una señal con el parámetro obj donde tienes "resetMyTimer", y cada ventana adjuntó la señal a su ranura de reinicio del temporizador, que verifica si un widget en la ventana * that * generó el evento para que cada ventana se bloquee de forma independiente de los otros –

+0

El evento solo parece enviarse a eventFilter() si ninguno de los widgets secundarios maneja dicho evento. ¿Hay alguna manera de asegurar que todos los eventos vayan a este filtro antes de ser procesados ​​en otro lugar? – KyleL

0

Uno de los mejores enfoques será capturar la señal xidle en lugar de atrapar tantos eventos del usuario. Aquí hay que capturar el evento QEvent: MouseMove también

Cuestiones relacionadas