How to detect if a Qt GUI application has been idle, inside the app itself (Qt)?
qt
Solution
Override QCoreApplication::notify and a timer on mouse/keyboard events?
(Or just store the time of the event and have a timer check that value periodically, which might be faster than resetting a timer all the time.)
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);
}
};
Problem
How to detect when a GUI application has been idle, (ie, no user interaction), for a period of time ? I have n number of Qt Screens , I want to bring Date-Time screen when application is idle for 5 seconds and when i click on Date-Time screen it should return back to the last screen. Currently I am using below code, now how to check if system is idle for 5 seconds bring a new form and when some body mousemove/click it should go back to the last form. ``` 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 } ``` And my main.cpp looks like this : ``` int main(int argc, char *argv[]) { QApplication a(argc, argv); MainForm w; w.show(); CustomEventFilter filter; a.installEventFilter(&filter); return a.exec(); } ``` Thanks.