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

如何在应用程序本身(Qt)内检测Qt GUI应用程序是否处于空闲状态?,qt,Qt,如何检测GUI应用程序在一段时间内空闲(即没有用户交互)的情况 我有n个Qt屏幕,我想在应用程序空闲5秒时显示日期时间屏幕,当我点击日期时间屏幕时,它应该返回到最后一个屏幕 目前我正在使用下面的代码,现在如何检查系统是否空闲5秒带来一个新表单,当某个主体鼠标移动/单击时,它应该返回到最后一个表单 CustomEventFilter::CustomEventFilter(QObject *parent) : QObject(parent) { m_timer.setInter

如何检测GUI应用程序在一段时间内空闲(即没有用户交互)的情况

我有n个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();


}
谢谢。

鼠标/键盘事件的覆盖和计时器

(或者只存储事件的时间,让计时器定期检查该值,这可能比一直重置计时器要快。)

根据:

使应用程序执行空闲状态 处理(即执行特殊的 只要没有挂起的 事件),使用超时为0的QTimer。 更高级的空闲处理方案 可以使用processEvents()实现


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

@user662285:Added。可能效率不高或不完整,但它应该让您朝着正确的方向开始。@Macke:我需要编写什么代码来检测系统空闲5秒,然后显示我的datetime屏幕?@user662285:我添加了一些示例代码来检测空闲5秒。datetime屏幕应该很简单,除非您在不同的进程中运行东西(存在各种选项,但您需要在这里更清楚地定义您的目标),或者您对Qt了解不够。(通过做一些教程来修复后者)。这不是一个没有你的想法就给你代码的网站。请思考您的问题,将其划分为可解决的子问题,对每个子问题进行攻击,并寻求详细的帮助。尽量避免“大范围”的问题。@Macke:我已经按照您的建议对上面的代码进行了详细说明。但该代码没有检测到系统空闲5秒。我的要求是当我运行我的应用程序时,如果我在5秒内不做任何事情,datetime屏幕(我已经有了)应该出现。@user:您需要启动计时器(我现在添加了)。那不行吗?您是否尝试过调试(在事件处理程序中使用printf)以查看发生了什么?另外,请参阅OrcunC的注释,您需要停止/启动处理程序中的计时器,而不仅仅是停止它。开始是必要的。我只是停止/启动它,以确保它从停止/启动间隔触发5秒。显示/关闭表单有什么问题?您的问题/反馈需要更具建设性,而不仅仅是“给我代码plz”和“不起作用,帮助?”。我们无法完成你所有的工作,我们也没有足够的智慧来找出哪些有效,哪些无效,除非你学会如何提供更多关于你问题的信息。@Macke:谢谢你,Macke。下次在SO.About you中提问时,我会记住代码:似乎您只是在ResetTimer()方法中停止计时器,但并没有重新启动它!Macke的代码似乎是正确的,但在每次鼠标和键盘事件中停止并重新启动计时器可能效率很低!最重要的是,在第一次空闲时隙调用时,他也停止计时器,而不重新启动它,或者不关心获得连续的空闲事件。所以在我看来,他的代码也不完美。@OrunC:你能帮忙吗?@OrunC:不,它不完美,但我认为如果我们在这里追求完美,我们将一事无成更新最后一个事件的时间值并运行检查该值的5秒计时器(并使用适当的时间重置自身,例如,如果最后一个事件发生在2秒前,则重置为3秒)可能是计算能力方面最有效的方法//在头文件中定义它//将其连接到cpp文件中的插槽连接(t,SIGNAL(timeout()),h,slot(idleCallback());t、 启动(0)//怠速启动定时器processing@OrunC:此流程正常。m_定时器设置间隔(5000);连接(&m_定时器,信号(timeout()),此,插槽(ResetTimer());m_定时器启动(0);在我的重置计时器中,我应该显示我的日期时间表吗?
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);
    }
};