QT 捕获事件(全局拦截)
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 捕获事件(全局拦截)的更多相关文章
- Qt中事件分发源代码剖析(一共8个步骤,顺序非常清楚:全局的事件过滤器,再传递给目标对象的事件过滤器,最终传递给目标对象)
Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的.下面举例说明: 1)首先看看下面一段示例代码: in ...
- PyQt(Python+Qt)学习随笔:使用实例方法赋值方式捕获事件
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<第15.17节 PyQt(Python+ ...
- 界面编程之QT的事件20180727
/*******************************************************************************************/ 一.事件 1 ...
- 为XHR对象所有方法和属性提供钩子 全局拦截AJAX
摘要 ✨长文 阅读约需十分钟 ✨跟着走一遍需要一小时以上 ✨约100行代码 前段时间打算写一个给手机端用的假冒控制台 可以用来看console的输出 这一块功能目前已经完成了 但是后来知道有一个腾讯团 ...
- Qt 自定义事件详细实例(继承QEvent,然后QCoreApplication::postEvent()、sendEvent())
创建用户事件 创建一个自定义类型的事件,首先需要有一个事件号,其值通常大于QEvent::User.为了传递事件信息,因此必须编写自定义的事件类,该事件类从QEvent继承. 编写用户事件:编写用户事 ...
- Qt中事件分发源代码剖析
Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的. 下面举例说明: 1)首先看看下面一段示例代码: i ...
- [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
面试题 event 事件 事件委托是什么? 如何阻止事件冒泡,阻止默认事件呢? Javascript 的事件流模型都有什么? 事件绑定和普通事件有什么区别? Event 对象 Event 对象,当事件 ...
- Qt的事件
Qt的事件机制 事件过滤器: 可以让一个对象侦听拦截另外一个对象的事件. 实现原理: 在所有Qt对象的基类:QObject中有一个 类型为:QObjectList 名字为:eventFilters 的 ...
- Qt中事件分发源码剖析
Qt中事件分发源码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,而且进行分发,这些都是在exec中进行的. 以下举例说明: 1)首先看看以下一段演示样例代码: ...
随机推荐
- jeecms添加站点
Step1:点击[站点管理],然后点击[添加站点]. Step2:按照下图填写,注意[路径]这一栏!!这里我随便写了个[aaa]. Step3:这个时候在本地部署的tomcat的模板路径:tomcat ...
- PL/SQl连接数据库ORA-12154错误
先说说我遇到的问题: 1.在sql/plus下可以正确连接到数据库(oracle10g): 2.检查我机器(64)位环境变量的配置,没问题.path环境变量没问题(C:\oraclexe\app\or ...
- JMETER的三个线程组
JMETER的三个线程组 Jmeter有三个线程组分类:Thread Group(线程组).setUp Thread Group.tearDown Thread Group,如下图所示: (1).th ...
- oracel 管理维护
共享池中的缓存: 绑定变量是一种优化执行的方式. lgwr 重做日志进程dbwr 数据写进程smon 系统监督进程pmon 进程监督进程ckpt 校验点进程 arch 归档日志进程 spool 命令可 ...
- SecondaryNameNode 理解
NameNode将对文件系统的改动追加保存到本地文件系统上的一个日志文件(edits).当一个NameNode启动时,它首先从一个映像文件(fsimage)中读取HDFS的状态,接着应用日志文件中的e ...
- UVA10253 Series-Parallel Networks
Series-Parallel Networks https://vjudge.net/problem/UVA-10253 如果用一个节点表示串联/并联操作,用一棵树表示每一个串并联网络,要求一个节点 ...
- Leetcode238. Product of Array Except Self除自身以外数组的乘积
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: [1 ...
- hdu6243
hdu6243结论题,每个的概率是(n-1)/n,然后乘以总数n,结果就是 n-1 #include<iostream> #include<cstdio> #include&l ...
- MySQL系列(十)--用户权限及远程访问
本文基于MySQL8.0,记录一下完整的远程访问的过程,以及这个过程中可能遇到的问题,MySQL运行在阿里云服务器,操作系统:CentOS 7.6 64位 顺便说下,买服务器还是要双十二这种拉新活动再 ...
- H5C3--文本阴影text-shadow
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...