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
  • 相关阅读:
    Spring 3.0 发布候选版 3 已经可用!
    NetBeans IDE 6.8 正式版发布!
    250g铜版纸 打印扑克?
    一键安装python
    京东商城副总裁李曦:大数据和电子商务_行业信息化_IT商业新闻网
    9.29的北京-》杭州的票怎么现在网上还没有可以预订呢。。。
    运动服火鸟2代三叶草运动服SWIM CLUB 1976款游泳秋装男款海马淘宝网
    无锡巨人网络科技有限公司简介20120411
    李国庆送的国旗太小了,没动力买东西
    虽然不信god,但是技术上还是算是有信yan的人吧
  • 原文地址:https://www.cnblogs.com/amwuau/p/8010804.html
Copyright © 2011-2022 走看看