QT 捕获应用键盘事件(全局拦截)

主窗口只有一个QTabWidget,
每个tab中嵌入相应的窗口,在使用的过程中,
需要主窗口响应键盘事件,而不是tab中的控件响应。
故采取以下方式。

重写QApplication,使用notify来控制拦截所有事件。

此方法不仅可拦截键盘事件,其他事件也可。

代码如下:

#include "mainwindow.h"
//#include <QApplication>
#include "application.h" #include "baselibdefine.h" int main(int argc, char *argv[])
{
Application a(argc, argv); MainWindow w;
w.show();
return a.exec();
}
#include "application.h"
#include <QDebug>
#include <QTranslator>
#include "baselibdefine.h" #ifdef Q_QDOC
Application::Application(int &argc, char **argv)
:QApplication(argc, argv)
{ }
#else
Application::Application(int &argc, char **argv, int flag)
:QApplication(argc, argv, flag)
{
connect(this, &Application::signal_keyPress, &w, &MainWindow::slot_keyPressed);
}
#endif Application::~Application()
{ } bool Application::notify(QObject *obj, QEvent * event)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (!keyNumberPress(keyEvent))
{
emit signal_keyPress(keyEvent);
return true;
}
}
else if (event->type() == QEvent::KeyRelease)
{
return true;
} return QApplication::notify(obj, event);
} bool Application::keyNumberPress(QKeyEvent * keyEvent)
{
if (keyEvent->key() == Qt::Key_0
|| keyEvent->key() == Qt::Key_1
|| keyEvent->key() == Qt::Key_2
|| keyEvent->key() == Qt::Key_3
|| keyEvent->key() == Qt::Key_4
|| keyEvent->key() == Qt::Key_5
|| keyEvent->key() == Qt::Key_6
|| keyEvent->key() == Qt::Key_7
|| keyEvent->key() == Qt::Key_8
|| keyEvent->key() == Qt::Key_9
|| keyEvent->key() == Qt::Key_Backspace
|| keyEvent->key() == Qt::Key_Delete)
{
return true;
} return false;
}
#ifndef APPLICATION_H
#define APPLICATION_H #include <QApplication>
#include "mainwindow.h" class Application : public QApplication
{
Q_OBJECT
public:
#ifdef Q_QDOC
Application(int &argc, char **argv);
#else
Application(int &argc, char **argv, int flag = ApplicationFlags);
#endif virtual ~Application(); private:
bool keyNumberPress(QKeyEvent *); protected:
bool notify(QObject *obj, QEvent *event) Q_DECL_OVERRIDE; public:
MainWindow w; signals:
void signal_keyPress(QKeyEvent *keyEvent);
}; #endif // APPLICATION_H

QT 捕获事件(全局拦截)的更多相关文章

  1. Qt中事件分发源代码剖析(一共8个步骤,顺序非常清楚:全局的事件过滤器,再传递给目标对象的事件过滤器,最终传递给目标对象)

    Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的.下面举例说明: 1)首先看看下面一段示例代码: in ...

  2. PyQt(Python+Qt)学习随笔:使用实例方法赋值方式捕获事件

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<第15.17节 PyQt(Python+ ...

  3. 界面编程之QT的事件20180727

    /*******************************************************************************************/ 一.事件 1 ...

  4. 为XHR对象所有方法和属性提供钩子 全局拦截AJAX

    摘要 ✨长文 阅读约需十分钟 ✨跟着走一遍需要一小时以上 ✨约100行代码 前段时间打算写一个给手机端用的假冒控制台 可以用来看console的输出 这一块功能目前已经完成了 但是后来知道有一个腾讯团 ...

  5. Qt 自定义事件详细实例(继承QEvent,然后QCoreApplication::postEvent()、sendEvent())

    创建用户事件 创建一个自定义类型的事件,首先需要有一个事件号,其值通常大于QEvent::User.为了传递事件信息,因此必须编写自定义的事件类,该事件类从QEvent继承. 编写用户事件:编写用户事 ...

  6. Qt中事件分发源代码剖析

    Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的. 下面举例说明: 1)首先看看下面一段示例代码: i ...

  7. [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流

    面试题 event 事件 事件委托是什么? 如何阻止事件冒泡,阻止默认事件呢? Javascript 的事件流模型都有什么? 事件绑定和普通事件有什么区别? Event 对象 Event 对象,当事件 ...

  8. Qt的事件

    Qt的事件机制 事件过滤器: 可以让一个对象侦听拦截另外一个对象的事件. 实现原理: 在所有Qt对象的基类:QObject中有一个 类型为:QObjectList 名字为:eventFilters 的 ...

  9. Qt中事件分发源码剖析

    Qt中事件分发源码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,而且进行分发,这些都是在exec中进行的. 以下举例说明: 1)首先看看以下一段演示样例代码: ...

随机推荐

  1. ionic4环境搭建

    1.下载安装node 下载地址:https://nodejs.org/en/ 安装后,win+R输入cmd,回车运行cmd命令窗口,输入下面的命令验证node是否安装成功: 如果出现上图所示,则证明n ...

  2. JAVA面试常见问题之开源框架和容器篇

    1.Servlet的生命周期 加载:加载到虚拟机 初始化:init() 一个生命周期中只会被调用一次. 服务:service() 销毁:destroy() 2.转发与重定向的区别 转发在服务器端完成的 ...

  3. CF 578B "Or" Game

    传送门 解题思路 题意大概是给你一个数列,可以进行k次操作,每次操作可以选择一个数乘x,问操作后的或的最大值.根据位运算,位数越高答案越优,所以贪心的使这k次操作全都放到一个数上,这样的结果肯定较优. ...

  4. Unknown command: crawl

    Use "scrapy" to see available commands 1.使用命令行方式cmd,是因为没有cd到项目的根目录,crawl会去搜索cmd目录下的scrapy. ...

  5. angular1.0 $http jsonp callback

    $http.jsonp(sDUrl,{cache:false,jsonpCallbackParam:'callback'}); https://stackoverflow.com/questions/ ...

  6. SpringBoot+Shiro+mybatis整合实战

    SpringBoot+Shiro+mybatis整合 1. 使用Springboot版本2.0.4 与shiro的版本 引入springboot和shiro依赖 <?xml version=&q ...

  7. redis教程(二)-----redis事务、记录日志到redis、分布式锁

    redis事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余 ...

  8. 手残,盘符前边多打一个空格导致的message d:\WEB_APP_QuChongFu\file\五月.xlsx (文件名、目录名或卷标语法不正确。)

    尝试读取并解析一个excel文件,一直提示错误 但是有个原始数据,导入就没问题 对比了一下,好像也就是字母d的大小写有区别 我先把大写的D改成小写的试试,如果是大小写问题,那应该抛出异常 好吧,好像并 ...

  9. go语言:类型转换

    类型转换用于将一种类型的变量转换为另一种类型的变量. 有以下场景: package main import "fmt" func main() { var sum int = 17 ...

  10. springmvc下载一个文档下载接口里的文档

    A提供了一个文件下载的接口,在调用的时候可以直接在前端用a标签来调用 <a href="http://" target="_blank">下载< ...