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
复制代码

 

posted @   风来风往风伤(TiAmo)  阅读(7115)  评论(3编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示