如何在一段时间内检测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();
}
感谢。
答案 0 :(得分:6)
使您的应用程序执行空闲 处理(即执行特殊处理) 只要没有待处理的功能 事件),使用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);
}
};