2011-06-30 16 views
7

Jak wykryć, że aplikacja GUI była bezczynna, (bez interakcji użytkownika) przez pewien okres czasu?Jak wykryć, czy aplikacja Qt GUI była bezczynna w samej aplikacji (Qt)?

Mam liczbę ekranów Qt, chcę przynieść ekran daty i czasu, gdy aplikacja jest bezczynna przez 5 sekund, a kiedy kliknę na ekranie data-godzina, powinien powrócić do ostatniego ekranu.

Obecnie używam poniższego kodu, teraz, jak sprawdzić, czy system jest bezczynny przez 5 sekund, przynieść nowy formularz, a kiedy jakaś machinalna mysz/kliknij powinna powrócić do ostatniej formy.

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 

} 

A moja main.cpp wygląda następująco:

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

    return a.exec(); 


} 

Dzięki.

+0

Na czym polega problem z wyświetlaniem/zamykaniem formularza? – Macke

+1

Musisz być bardziej konstruktywny w swoich pytaniach/komentarzach, nie tylko "daj mi kod plz" i "nie działa, pomoc?". Nie możemy wykonać całej twojej pracy, ani nie jesteśmy wystarczająco sprytni, aby dowiedzieć się, co działa, a co nie, jeśli nie dowiesz się, jak dostarczyć więcej informacji o problemie. – Macke

+0

@Macke: Dziękuję Macke. Będę o tym pamiętać następnym razem, zadając pytania w SO. – user662285

Odpowiedz

3

Zastąpić QCoreApplication::notify i timer na zdarzeniach myszy/klawiatury?

(lub po prostu zapisać czas zdarzenia i mieć kontrolę timera tej wartości okresowo, co może być szybsze niż resetowanie czasomierza cały czas.)

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

@ Macka: Dowolna próbka pls ... – user662285

+0

@ user662285: Dodano. Może nie jest sprawny ani kompletny, ale powinien zacząć od właściwej pracy. – Macke

+0

@Macke: Jaki kod, który muszę napisać, aby wykryć system jest bezczynny przez 5 sekund, a następnie pokazuje ekran datetime? – user662285

5

Według QT Documentation:

Aby aplikacja wykonała bezczynne przetwarzanie (tj. Wykonując specjalną funkcję , gdy nie ma oczekujących zdarzeń ), użyj QTimer z 0 limitem czasu. Bardziej zaawansowane schematy przetwarzania w trybie bezczynności można uzyskać przy użyciu metody processEvents().

Musisz więc utworzyć QTimer z zerowym interwałem czasu i podłączyć go do slotu, który jest wywoływany, gdy aplikacja jest bezczynna.

+0

@OrunC: Pls zobacz mój powyższy kod jest OK? – user662285

+0

O twoim kodzie: Wygląda na to, że właśnie zatrzymujesz timer w metodzie ResetTimer(), ale nie uruchamiasz go ponownie! Kod Macke wydaje się poprawny, ale prawdopodobnie bardzo nieefektywne jest zatrzymywanie i restartowanie timera na każdym pojedynczym zdarzeniu myszy i klawiatury! Oprócz tego na pierwszym nieczynnym połączeniu wrzutowym zatrzymuje także zegar i nie uruchamia go ponownie lub nie dba o ciągłe, bezczynne zdarzenia. Więc jego kod nie jest również doskonały w mojej opinii. –

+0

@OrunC: Czy możesz w tym pomóc? – user662285

Powiązane problemy