全局事件:
默認事件只是針對於一個區域,比如控件,不是整體所有控件得事件,而全局事件,是所有控件匯總得地方。
目的:
實現只要在程序內就可隨意點擊按鍵,就會監測到
實現方式:
通過繼承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