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

 

原文地址:https://www.cnblogs.com/zezhou/p/12861089.html