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键,程序不会退出,完成了最初目的,类似操作可以拦截更多事件。

posted @   阳光下的小土豆  阅读(851)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示