最近做项目中用到屏保,在按键或者触屏之后唤醒屏保,在之前的文章中已经写好了用屏保的QWSServer类的只用,我们找那个方法用触摸唤醒的话,如果正好手指是触摸在一个有动作的按钮上,那马屏保恢复之后看见的屏幕不是屏保之前的界面了,这次项目上要求唤醒的时候这个情况不能发生,那么就要求触摸屏事件和键盘事件不能向应用窗口发送才能实现,考虑或很多方法,比如我在唤醒屏保后进入函数的执行的第一句就是发送个信号,给应用程序中的app上安装事件过滤器,事件过滤器中把事件过滤掉,在app中安装时间过滤器的方法:
1、首先重载过滤器函数,在前面的屏保中定义一个信号,在程序刚进入屏保的时候把这个触发的鼠标或者键盘事件过滤后移除过滤器。由于QWSServer类是在Qt中直接定义的,是个虚基类,需要重载才能使用,继承这个类重载里面的save()和restore()函数之后才能用,这部分在屏保部分说明,想实现信号槽功能,这个类必须多重继承,在继承QWSServer类的同时继承QObject,并且把QObject放在前面才能实现信号槽的功能。
bool mainwindos::eventFilter(QObject *target, QEvent *event)
{
if (event->type() == QEvent::MouseButtonDblClick
|| event->type() == QEvent::MouseButtonPress
|| event->type() == QEvent::MouseButtonRelease
|| event->type() == QEvent::MouseMove
|| event->type() == QEvent::MouseTrackingChange || event->type()==QEvent::KeyPress
|| event->type() == QEvent::KeyRelease)
{
qDebug("a keyboard or mouse event ");
event->ignore();
return true;
}
else
return QWidget::eventFilter(target,event);
}
在QApplication对象上安装事件过滤器
qApp->removeEventFilter(this);
因为qApp是指向QApplication对象的。
也可以在事件过滤器中过滤特定的键值
bool process_base::eventFilter(QObject *target, QEvent *event)
{
// qDebug("event filter entered %d",i);
if ( event->type()==QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);