如何在Qt QMainWindow中检测用户不活动?到目前为止,我的想法是使用一个QTimer来增加一个计数器,如果传递了某个值,它将锁定应用程序。任何鼠标或键交互都应该将计时器设置回0.但是我需要知道如何正确处理重置的输入事件;我可以重新实施:
virtual void keyPressEvent(QKeyEvent *event)
virtual void keyReleaseEvent(QKeyEvent *event)
virtual void mouseDoubleClickEvent(QMouseEvent *event)
virtual void mouseMoveEvent(QMouseEvent *event)
virtual void mousePressEvent(QMouseEvent *event)
virtual void mouseReleaseEvent(QMouseEvent *event)
...但QMainWindow中所有小部件的事件处理程序是否会阻止这些控件中发生的事件到达QMainWindow?是否有更好的架构来检测用户活动?
答案 0 :(得分:9)
您可以使用自定义事件过滤器来处理应用程序在传递给子窗口小部件之前收到的所有键盘和鼠标事件。
class MyEventFilter : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *ev)
{
if(ev->type() == QEvent::KeyPress ||
ev->type() == QEvent::MouseMove)
// now reset your timer, for example
resetMyTimer();
return QObject::eventFilter(obj, ev);
}
}
然后使用类似
的内容MyApplication app(argc, argv);
MyEventFilter filter;
app.installEventFilter(&filter);
app.exec();
这肯定有效(我自己试过)。
编辑:非常感谢ereOn指出我之前的解决方案不是很有用。
答案 1 :(得分:0)
更好的方法之一是捕获xidle信号,而不是从用户那里捕获如此多的事件。这里需要捕获QEvent:MouseMove事件