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

     

  • 相关阅读:
    简单的冒泡排序算法(java)
    寻找两个数组中的公共元素Java程序代码
    利用快速排序求两集合交集
    一种简单的吉布斯采样modify中应用
    递归生成小于某个数的所有集合
    卡拉曼算法简答程序
    模态对话框退出DoModal过程中需注意的陷阱
    是否可以使用空对象指针调用成员函数及访问成员变量
    windows c++如何使窗口动态改变位置
    windows的滚动条使用
  • 原文地址:https://www.cnblogs.com/zezhou/p/12861089.html
Copyright © 2011-2022 走看看