全局事件:
默认事件只是针对于一个区域,比如控件,不是整体所有控件得事件,而全局事件,是所有控件汇总得地方。
目的:
实现只要在程序内就可随意点击按键,就会监测到
实现方式:
通过继承QApplication,编写事件过滤器实现。
下面例子要实现得功能是:
长按空格录音,所以空格按下表示开始录音,抬起表示录音结束。
GlobalApplication.h
#include <QApplication> #include <QWidget> class GlobalApplication : public QApplication { public: GlobalApplication(int&argc,char **argv); ~GlobalApplication(); // bool notify(QObject*, QEvent *); bool eventFilter(QObject *, QEvent *); 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"; //拦截 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() << "stop"; //拦截 return true; } } //不进行拦截 return false; }
// QEvent::KeyPress 键盘按下事件
// QEvent::KeyRelease 键盘按下抬起事件
// key_press->isAutoRepeat() 这点很重要,默认持续长按就返回true,加上这个取反表示一直按着也指表示按了一次
main.cpp
#include "MainWindow.h" #include <QApplication> #include "GlobalApplication.h" int main(int argc, char *argv[]) { GlobalApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
原文:https://www.cnblogs.com/zezhou/p/12861089.html