zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    暑假D16 T3 密道(数位DP? 打表找规律)
    暑假D16 T2 无聊 (深搜)
    暑假D14 T3 cruise(SDOI2015 寻宝游戏)(虚树+set)
    Django url
    http协议
    host文件以及host的作用
    用socket写一个简单的服务器
    python中*args **kwargs
    javascript 判断对像是否相等
    html input标签详解
  • 原文地址:https://www.cnblogs.com/zezhou/p/12861089.html
Copyright © 2011-2022 走看看