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. python实现简单的百度翻译

    这段时间,一直在学python,想找点东西实现一下,练手,所以我想通过python代码来实现翻译,话不多说,看吧! 以chrome为例 1  打开百度翻译 https://fanyi.baidu.co ...

  2. python在WIN下CMD运行中文乱码及python 2.x python 3.x编码问题

    在CMD中运行python代码时,我们会发现,即使在代码中加入# -*- coding:utf-8 -*- 这段代码,中文仍然会乱码.如下: # -*- coding:utf-8 -*- conten ...

  3. LUOGU P3111 [USACO14DEC]牛慢跑Cow Jog_Sliver

    传送门 解题思路 比较简单的一道思路题,首先假设他们没有前面牛的限制,算出每只牛最远能跑多远.然后按照初位置从大到小扫一遍,如果末位置大于等于前面的牛,那么就说明这两头牛连一块了. 代码 #inclu ...

  4. TZ_06_SpringMVC的入门程序

    SpringMVC的入门程序 1. 创建WEB工程,引入开发的jar包 1. 具体的坐标如下 2. 配置核心的控制器(配置DispatcherServlet) 1. 在web.xml配置文件中核心控制 ...

  5. TZ_05_Spring_Proxy基于接口的动态代理和基于类的动态代理

    代理:为了增强方法在不添加代码的情况下 1.Proxy基于接口的动态代理 /** * 模拟一个消费者 * @author Administrator * */ public class Client ...

  6. JavaScript的原型链

    首先介绍下原型~原型的作用:把方法放到原型中,就可以让同类型的对象共享 . 当我创建一个构造函数.构造函数里有原型.通过:构造函数名.prototype获取到当前构造函数的原型. function S ...

  7. 【笔记】Python3导入包规则

    例如:这里给出了一种可能的包结构(在分层的文件系统中): sound/ 顶层包 __init__.py 初始化 sound 包 formats/ 文件格式转换子包 __init__.py wavrea ...

  8. C#多线程之间事件通知

    我有两个线程,线程1接受网络数据,存到队列;线程2取队列,进行各种复杂的处理然后绘制到界面上;想让线程1有数据了通知线程2,线程2再取队列,因为不通知的话,线程2一直在while循环检索队列时候有东西 ...

  9. hibernate分页功能

    设置开始位置无效 设置终止位置是可以的 设置完之后,并没有分页 问题解决 https://blog.csdn.net/qq_39859824/article/details/77902488 http ...

  10. DTD约束与schema约束的不同

    本篇笔记了解------Schema约束的语法 ------可以参考W3school之Schema教程. Schema:是基于 XML 的 DTD 替代者,用于描述XML文档结构.支持XML 命名空间 ...