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. (一)SpringBoot入门【基于2.x版本】

    SpringBoot入门[基于2.x版本] 一.SpringBoot简介 首先大家学习SpringBoot的话,我希望大家是有一定java基础的,如果是有Spring的基础的话,上手会更加得心应手,因 ...

  2. 《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)

    这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的 ...

  3. css3之属性选择器

    总体来看一下都有哪些选择器 1.属性选择器  1)[att*=val] 2)[att^=val] 3)[att$=val] 2.结构伪类选择器 3.UI伪类选择器 其中E:read-only伪类选择器 ...

  4. Go之路一

    一.声明变量 var a int var b string var c []float32 var d func() bool var e struct{ x int } 第1行,声明一个整型类型的变 ...

  5. CodeForces - 627A

    CodeForces - 627Ahttps://vjudge.net/problem/326413/origina+b == (a&b)<<1 +(a^b);然后是位运算,如果对 ...

  6. Codeforces 455B

    题目链接 B. A Lot of Games time limit per test 1 second memory limit per test 256 megabytes input standa ...

  7. gomod

    package main import "mycore" func main(){ mycore.ShowName() } main.go module mytest requir ...

  8. spring boot 的 ApplicationContext 及 getbean

    在spring中,我们通过如下代码取得一个spring托管类: ApplicationContext ac = new FileSystemXmlApplicationContext("ap ...

  9. 1、jxl导入/导出excel案例,黏贴即可运行

    package junit.test; import java.io.File; import java.io.IOException; import java.util.ArrayList; imp ...

  10. Mybatis错误:Result Maps collection already contains value for ***

    [转载]原文链接:https://blog.csdn.net/maoyuanming0806/article/details/77870345 使用mybatis时,服务器启动时出错 严重: Exce ...