如何在应用程序本身(Qt)内检测Qt GUI应用程序是否已空闲?

时间:2011-06-30 09:08:30

标签: qt

如何在一段时间内检测GUI应用程序何时处于空闲状态(即无用户交互)?

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

目前我正在使用下面的代码,现在如何检查系统是否空闲5秒钟带来一个新表单,当一些身体鼠标移动/点击它应该返回到最后一个表单。

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


}

感谢。

2 个答案:

答案 0 :(得分:6)

根据QT Documentation

  

使您的应用程序执行空闲   处理(即执行特殊处理)   只要没有待处理的功能   事件),使用QTimer与0超时。   更先进的空闲处理方案   可以使用processEvents()实现。

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

答案 1 :(得分:4)

在鼠标/键盘事件上覆盖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);
    }
};