事件过滤器使用:
在类中使用eventfilter去过滤 ESC按键,并且返回过滤器,可以使过滤器一直保持监听状态。 但是当使用signal和slot改变类内stackwidget的状态后,eventfilter监听失效。
问题描述
收到外部发来的信号后,eventfilter失效,就监听不到ESC事件了:
//************************.h
Class Showwindow:Public QDialog
{
Q_Object
Public :
explict Showwindow(QWidget *parent=nullptr);
private slots:
void receive(int);
protect:
eventFilter(QObject* obj,QEvent *event);
}
//************************.cpp
Showwindow:: Showwindow(QWidget* parent):QDialog(parent)
{
installEventFilter(this);
connect(childrenPage,SIGNAL(send(int)),this,SLOT(receive(int)));
}
void Showwindow::receive(int indx)
{
ui->stackwidget->setcurrentIndex(indx);
//setFoucs(); //加入焦点,防止焦点在其他控件上打断事件过滤器的循环
}
bool Showwindow:: eventFilter(QObject *obj, QEvent *event)
{
if(event==QEvent::keyPress)
{
//如果提示未继承,出现不能强转的时候,需要include QKeyEvent
QKeyEvent *keyevent = static_cast<QKeyEvent*>(event);
if(keyevent->key()==Qt::Key_Escape)
{
return true; //返回1表示该事件不再进一步处理 返回0表示其余事件交还给目标对象处理
}
}
return QDialog::eventFilter(QObject* obj,QEvent *event);
}
原因分析:
因为其他有焦点的控件有优先处理该键盘事件,并且其他控件也把事件处理了,那么Qt的事件循环就会被中断掉,就收不到消息了。
解决方案:
在收到信号后加入焦点 setFoucs() 使焦点回到类中而不是控件上: