zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    了解大数据的特点、来源与数据呈现方式
    作业五 | 结对项目-四则运算 “软件”之升级版
    作业四 | 个人项目-小学四则运算 “软件”之初版
    作业三 | 阅读《构建之法》1-5章
    作业二 | Git的安装与使用
    随笔 | 对计算机专业的自我思考
    【大数据作业二】字符串操作,英文词频统计预处理
    【大数据作业一】了解大数据的特点、来源与数据呈现方式
    结对项目——四则运算 “软件”之升级版
    作业四 个人项目-小学四则运算 “软件”
  • 原文地址:https://www.cnblogs.com/amwuau/p/8010804.html
Copyright © 2011-2022 走看看