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)首先看看以下一段演示样例代码: ...
随机推荐
- [转载] OpenCV2.4.3 CheatSheet学习(二)
二.矩阵操作(拷贝.洗牌.局部访问): src.copyTo(dst) 把src矩阵中的数据拷贝到dst. src.convertTo(dst, type,scale, shift) 缩放并转换到另外 ...
- 《DSP using MATLAB》Problem 7.31
参照Example7.27,因为0.1π=2πf1 f1=0.05,0.9π=2πf2 f2=0.45 所以0.1π≤ω≤0.9π,0.05≤|H|≤0.45 代码: %% +++++++++ ...
- python-web-webbrower-beautifuSoup
webbrowser:是 Python 自带的,打开浏览器获取指定页面. requests:从因特网上下载文件和网页. Beautiful Soup:解析 HTML,即网页编写的格式. seleniu ...
- 设置eclipse自动补全
点击" Window>Preferences"; 选择"Java>Editor>Content Assist",在右侧的"Auto- ...
- Leetcode455.Assign Cookies分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j ,都有一个尺寸 ...
- node学习记录——搭建web服务器
web服务器的基本知识 功能:1.接收HTTP请求(get,post,delete,put)2.处理HTTP请求 常见的web服务器架构: 1. Nginx/Apache:负责接收http请求,确定谁 ...
- poj 3304 Segments(计算直线与线段之间的关系)
Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10921 Accepted: 3422 Descrip ...
- Java review-design pattern
Design Patterns (Factory, Abstract Factory, singleton, DAO, Proxy): 1. Factory: In Factory pattern, ...
- 锋利的jQuery学习笔记之jQuery选择器
在介绍jQuery选择器之前,先简单介绍一下CSS选择器---> 一.CSS选择器 常见的CSS选择器有以下几种: 选择器 语法 描述 示例 标签选择器 E{CSS规则} 以文档元素为选择符 t ...
- update当根据条件不同时 更新同一个字段的方法 或多表插入
1.通过存储过程 循环 传值 create or replace procedure p_u isbegin for rs in (select distinct (rks) from rkbz)lo ...