• QT全局事件和绑定


    全局事件:

    默认事件只是针对于一个区域,比如控件,不是整体所有控件得事件,而全局事件,是所有控件汇总得地方。

    目的:

    实现只要在程序内就可随意点击按键,就会监测到

    实现方式:

    通过继承QApplication,编写事件过滤器实现。

    下面例子要实现得功能是:

    长按空格录音,所以空格按下表示开始录音,抬起表示录音结束。

    GlobalApplication.h

    #include <QApplication>
    #include <QWidget>
    
    class GlobalApplication : public QApplication
    {
        Q_OBJECT
    public:
         GlobalApplication(int&argc,char **argv);
         ~GlobalApplication();
    
         // bool notify(QObject*, QEvent *);
         bool eventFilter(QObject *, QEvent *);
    signals:
         // 自定义信号
         void start_audio_signal();
         void stop_audio_signal();
    private:
         QWidget *widget;
    };

    GlobalApplication.cpp

    #include "GlobalApplication.h"
    #include <QEvent>
    #include <QKeyEvent>
    #include <QDebug>
    
    GlobalApplication::GlobalApplication(int &argc,char **argv):
    QApplication(argc,argv)
    {
        // 必须要安装过滤器
        this->installEventFilter(this);
    }
    
    GlobalApplication::~GlobalApplication()
    {
    
    }
    
    // 监测得空格
    bool GlobalApplication::eventFilter(QObject *object, QEvent *event)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *key_press = static_cast<QKeyEvent *>(event);
            if (key_press->key() == Qt::Key_Space && !key_press->isAutoRepeat())
            {
                // qDebug() << "start";
                // 发射自定义信号
                emit start_audio_signal();
                //拦截
                return true;
            }
        }
        else if(event->type() == QEvent::KeyRelease)
        {
            QKeyEvent *key_release = static_cast<QKeyEvent *>(event);
            if (key_release->key() == Qt::Key_Space && !key_release->isAutoRepeat())
            {
                // qDebug() << "end";
                emit stop_audio_signal();
                //拦截
                return true;
            }
        }
        //不进行拦截
        return false;
    }

    // QEvent::KeyPress  键盘按下事件

    // QEvent::KeyRelease 键盘按下抬起事件

    // key_press->isAutoRepeat() 这点很重要,默认持续长按就返回true,加上这个取反表示一直按着也指表示按了一次

    main.cpp

    #include "MainWindow.h"
    #include <QApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
    GlobalApplication *app = new GlobalApplication(argc, argv);
    // 需要传app,做绑定事件
        MainWindow win(app);
        win.resize(1280, 900);
        win.show();
        return app->exec();
    }

    MainWindow.h

    MainWindow.cpp

     

  • 相关阅读:
    【noip2011】选择客栈
    【noip2013】货车运输
    【bzoj3732】Network
    Codeforces 111C Petya and Spiders (状压dp)
    线段树优化 dijkstra (CF787D Legacy)
    Codeforces 908G Yet Another Maxflow Problem (最小割定理,线段树)
    IOI 2007 Sail (线段树+贪心)
    Codeforces 474E Pillars (树状数组+dp)
    Bzoj 3688 折线统计(dp+树状数组)
    Gorgeous Sequence (线段树)
  • 原文地址:https://www.cnblogs.com/zezhou/p/12861089.html
Copyright © 2020-2023  润新知