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
  • 相关阅读:
    bzoj3505 数三角形 组合计数
    cogs2057 殉国 扩展欧几里得
    cogs333 荒岛野人 扩展欧几里得
    bzoj1123 BLO tarjan求点双连通分量
    poj3352 road construction tarjan求双连通分量
    cogs1804 联合权值 dp
    cogs2478 简单的最近公共祖先 树形dp
    cogs1493 递推关系 矩阵
    cogs2557 天天爱跑步 LCA
    hdu4738 Caocao's Bridge Tarjan求割边
  • 原文地址:https://www.cnblogs.com/amwuau/p/8010804.html
Copyright © 2011-2022 走看看