Qt拦截特定按键
转自:https://blog.csdn.net/baidu_33879812/article/details/104905524
背景:Qt应用运行时,键盘ESC按下导致程序异常退出,需要在程序整个运行期间拦截ESC这个按键响应。
Qt整个运行机制是事件循环,在运行期间如果需要拦截特定的任务,Qt提供一个便捷的处理机制,就是事件过滤器。因为过滤器的定义在QObject类中,所以只要继承了这个类,就可以使用installEventFilter()这个方法来使能过滤器。当然默认的过滤器不会过滤任何行为,如果想过滤特定行为,则需要对过滤器进行重写。
QObject类中定义的eventfilter():
1 virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );
此方法返回bool,过滤就返回true,否则flase。
重写事件过滤器:
1 #include <QKeyEvent> 2 3 class MyEventFilter : public QObject { 4 public: 5 bool eventFilter( QObject *obj, QEvent *event ) override { 6 if ( event->type() == QEvent::KeyPress || 7 event->type() == QEvent::KeyRelease ) { 8 if ( ( (QKeyEvent *) event )->key() == Qt::Key_Escape ) { 9 qDebug("ESC press!"); 10 return true; 11 } 12 } 13 return false; 14 } 15 };
完成对事件过滤器的重写后,需要在需要拦截的页面进行安装,如果是在子页面(子进程)中进行安装,那么它只在当前页面生效,并不会影响到别的页面,如果想在全局使用,那么就需要在第一个基页面中安装。安装是调用QObject类中的一个方法。
QObject类中定义的安装方法:
1 void QObject::installEventFilter ( QObject * filterObj )
全局过滤这个键盘事件:
1 QApplication a(argc, argv); 2 a.installEventFilter(new MyEventFilter);
最终效果:
Qt应用启动期间,不会响应按压ESC键,程序不会退出,完成了最初目的,类似操作可以拦截更多事件。