2011-06-30 57 views
7

如何检测GUI应用程序何时闲置(即无用户交互)一段时间?如何在应用程序本身(Qt)内检测Qt GUI应用程序是否已经空闲?

我有n个Qt屏幕,我想在应用程序闲置5秒时带上日期时间屏幕,当我点击日期时间屏幕时,它应该返回到最后一个屏幕。

目前我正在使用下面的代码,现在如何检查系统是否闲置5秒,带来一个新的窗体,当某些body mousemove/click它应该返回到最后一个窗体。

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 

} 

而且我的main.cpp看起来是这样的:

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

    return a.exec(); 


} 

感谢。

+0

显示/关闭表单有什么问题? – Macke

+1

您需要在您的问题/反馈中更具建设性,而不仅仅是“给我代码plz”和“不工作,帮助?”。我们不能做所有的工作,我们也不够聪明,除非你学会如何提供更多关于你的问题的信息,否则我们不能够弄清楚什么有效,什么不可行。 – Macke

+0

@Macke:谢谢麦凯。下次在SO中提问时,我会牢记在心。 – user662285

回答

3

覆盖QCoreApplication::notify和鼠标/键盘事件计时器?

(或者只是存储事件的时间,有一个计时器检查定期值,这可能会比计时器复位所有的时间更快。)

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:任何样品请... – user662285

+0

@ user662285:已添加。也许效率不高或完整,但它应该让你开始正确的方向。 – Macke

+0

@Macke:我需要编写什么代码来检测系统空闲5秒钟,然后显示我的日期时间屏幕? – user662285

5

根据QT Documentation

要使您的应用程序执行空闲 处理(即,在没有未处理的 事件时执行特殊的 函数),请使用具有0超时的QTimer。 可以使用processEvents()来实现更高级的空闲处理方案 。

因此,您需要创建一个零超时间隔的QTimer,并将其连接到应用程序闲置时调用的插槽。

+0

@OrunC:请参阅我的上述代码是否正常? – user662285

+0

关于您的代码:您似乎只是在ResetTimer()方法中停止计时器,但您并未重新启动计时器! Macke的代码似乎是正确的,但在每一次鼠标和键盘事件中停止并重新启动计时器可能效率很低!最重要的是,在第一个空闲插槽呼叫时,他也停止计时器,不重新启动它,或者不关心获取连续的空闲事件。所以他的代码在我看来也不完美。 –

+0

@OrunC:你能帮忙吗? – user662285