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
时间: 2024-10-10 20:58:41

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

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

Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的.下面举例说明: 1)首先看看下面一段示例代码: [cpp] view plaincopy int main(int argc, char *argv[]) { QApplication a(argc, argv); MouseEvent w; w.show(); return a.exec(); } 2)a.exec进入事件循环,调用的是QAppli

QT事件过滤器(全局过滤,省事)

Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件. 让我们试着设想已经有了一个CustomerInfoDialog的小部件.CustomerInfoDialog 包含一系列QLineEdit. 现在,我们想用空格键来代替Tab,使焦点在这些QLineEdit间切换. 一个解决的方法是子类化QLineEdit,重新实现keyPressEvent(),并在keyPressEvent()里调用focusNextChild().像下面这样: void M

Qt中事件分发源代码剖析

Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的. 下面举例说明: 1)首先看看下面一段示例代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); MouseEvent w; w.show(); return a.exec(); } 2)a.exec进入事件循环,调用的是QApplication::exec(): int

Atitit. &#160;Js 冒泡事件阻止&#160;事件捕获&#160;&#160;&#160;事件传递 &#160;事件代理

Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理   1. 事件冒泡1 2. 事件捕获1 3. 同时支持了事件捕获阶段和事件冒泡阶段ddEventListener的第三个参数1 4. 事件代理3 5. 冒泡还是捕获?3 6. Js 冒泡事件阻止3 6.1. 返回false5 7. 事件冒泡 使处理函数有范围较大的触发面积,在“拖拽效果”脚本中是必须的5 8. refe6 8.1.1. 浅谈事件冒泡与事件捕获 - ac黄博客精选 - SegmentFault6   1. 事

SQL Server 默认跟踪 -- 捕获事件详解

SQL Server 默认跟踪 -- 捕获事件详解 哪些具体事件默认跟踪文件能够捕获到? --returns full list of events SELECT * FROM sys.trace_events --returns a full list of categories SELECT * FROM sys.trace_categories --returns a full list of subclass values SELECT * FROM sys.trace_subclass

Js冒泡事件和捕获事件

js中冒泡事件和捕获事件: 冒泡事件:冒泡事件是从里向外,即是从被绑定元素开始一直向外到达页面的所有祖先元素都会被触发,这 一过程被称为事件冒泡.这个事件从原始元素开始一直冒泡到DOM树的最上层 捕获事件:捕获事件是从页面的最上层到被绑定元素都会触发. IE只支持事件冒泡,不支持事件捕获 冒泡事件和捕获事件的方向是相反的. 形式如下图所示: 一般为浏览器中的元素绑定事件有2种方式: 一.直接在页面元素中进行绑定,此方式采用的是冒泡排序,如: <div id="eventExample&qu

剖析Qt的事件机制原理

版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 QT源码解析(二)深入剖析QT元对象系统和信号槽机制 QT源码解析(三)深入剖析QT元对象系统和信号槽机制(续) QT源码解析(四)剖析Qt的事件机制原理 QT源码解析(五)QLibrary跨平台调用动态库的实现 QT源码解析(六)Qt信号槽机制与事件机制的联系 QT源码解析(七)Qt创建窗

struts2 全局拦截器,显示请求方法和参数

后台系统中应该需要一个功能那就是将每个请求的url地址和请求的参数log出来,方便系统调试和bug追踪,使用struts2时可以使用struts2的全局拦截器实现此功能: import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; im

事件冒泡与捕获&amp;事件委托

设想这样一种情况 一个div里面有个span元素  ,当鼠标单击span时,这个事件算是谁的? div还是span? 准确的说两个都触发了,这种认可大家都同意,事实就是这样的, 第二个问题来了,这个事件应该有个先后顺序 ,先触发span还是div? 早期就有两个主流的浏览器厂商各执己见,IE认为,这个事件首先触发span,然后依次往父节点传递,最终传递到document,(这个过程称为冒泡) 网景浏览器认为,任何事件都首先触发document,然后依次往下传递到span元素,(这个过程称为捕获)