2011-06-30 21 views
7

Cómo detectar cuando una aplicación GUI ha estado inactiva, (es decir, sin interacción del usuario), durante un período de tiempo?¿Cómo detectar si una aplicación GUI de Qt ha estado inactiva, dentro de la propia aplicación (Qt)?

Tengo n número de pantallas Qt, quiero mostrar la pantalla de fecha y hora cuando la aplicación está inactiva durante 5 segundos y cuando hago clic en la pantalla de fecha y hora, debería volver a la última pantalla.

Actualmente estoy usando el código de abajo, ahora cómo comprobar si el sistema está inactivo durante 5 segundos trae una nueva forma y cuando algún cuerpo mousemove/clic debería volver al último formulario.

CustomEventFilter::CustomEventFilter(QObject *parent) : 
    QObject(parent) 
{ 
    m_timer.setInterval(5000); 
    connect(&m_timer,SIGNAL(timeout()),this,SLOT(ResetTimer())); 
} 

bool CustomEventFilter::eventFilter(QObject *obj, QEvent *ev) 
{ 
    if(ev->type() == QEvent::KeyPress || 
      ev->type() == QEvent::MouseMove) 
    { 
     ResetTimer(); 
     return QObject::eventFilter(obj, ev); 

    } 
    else 
    { 

    } 
} 

bool CustomEventFilter::ResetTimer() 
{ 
    m_timer.stop(); // reset timer 

} 

Y mi main.cpp se parece a esto:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainForm w; 
    w.show(); 
    CustomEventFilter filter; 
    a.installEventFilter(&filter); 

    return a.exec(); 


} 

Gracias.

+0

¿Cuál es el problema con mostrar/cerrar un formulario? – Macke

+1

Necesita ser más constructivo en sus preguntas/comentarios, no solo "darme el código por favor" y "no funciona, ¿ayuda?". No podemos hacer todo tu trabajo, ni somos lo suficientemente inteligentes como para descubrir qué funciona y qué no funciona a menos que aprendas a proporcionar más información sobre tu problema. – Macke

+0

@Macke: Gracias, Macke. Tendré en cuenta la próxima vez que hago preguntas en SO. – user662285

Respuesta

3

¿Invalidar QCoreApplication::notify y un temporizador en eventos de mouse/teclado?

(O simplemente almacenar la hora del evento y tener un control temporizador que valoran periódicamente, lo que podría ser más rápido que reiniciar un temporizador todo el tiempo.)

class QMyApplication : public QApplication 
{ 
public: 
    QTimer m_timer; 

    QMyApplication() { 
     m_timer.setInterval(5000); 
     connect(&m_timer, SIGNAL(timeout()), this, SLOT(app_idle_for_five_secs()); 
     m_timer.start(); 
    } 
slots: 
    bool app_idle_for_five_secs() { 
     m_timer.stop(); 
     // ... 
    } 
protected: 
    bool QMyApplication::notify (QObject * receiver, QEvent * event) 
    { 
     if (event->type == QEvent::MouseMove || event->type == QEvent::KeyPress) { 
      m_timer.stop(); // reset timer 
      m_timer.start(); 
     }  
     return QApplicaiton::notify(receiver, event); 
    } 
}; 
+0

@Macke: Cualquier muestra por favor ... – user662285

+0

@ user662285: Agregado. Quizás no sea eficiente o completo, pero debería ayudarlo a comenzar en la dirección correcta. – Macke

+0

@Macke: ¿Qué código necesito escribir para detectar el sistema está inactivo durante 5 segundos y luego mostrar mi pantalla de fecha y hora? – user662285

5

Según QT Documentation:

Para hacer que su aplicación realice el procesamiento inactivo (es decir, ejecutar una función especial cuando no haya eventos pendientes), use un temporizador QT con 0 tiempo de espera. Se pueden lograr esquemas de procesamiento inactivo más avanzados usando processEvents().

Por lo tanto, debe crear un QTimer con cero intervalo de tiempo de espera y conectarlo a su ranura que se invoca cuando la aplicación está inactiva.

+0

@OrunC: Pls ver mi código anterior ¿está bien? – user662285

+0

Acerca del código: parece que simplemente está deteniendo el temporizador en el método ResetTimer() pero no lo está reiniciando. El código de Macke parece correcto, pero probablemente sea muy ineficiente detener y reiniciar un temporizador en cada evento de mouse y teclado. Además de eso, en la primera llamada de tiempo libre inactivo también está deteniendo el temporizador y no reiniciándolo o no le importa tener eventos inactivos continuos. Entonces su código tampoco es perfecto en mi opinión. –

+0

@OrunC: ¿Pueden ayudarme con esto? – user662285

Cuestiones relacionadas