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

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM