轉自:https://blog.csdn.net/baidu_33879812/article/details/104905524
背景:Qt應用運行時,鍵盤ESC按下導致程序異常退出,需要在程序整個運行期間攔截ESC這個按鍵響應。
Qt整個運行機制是事件循環,在運行期間如果需要攔截特定的任務,Qt提供一個便捷的處理機制,就是事件過濾器。因為過濾器的定義在QObject類中,所以只要繼承了這個類,就可以使用installEventFilter()這個方法來使能過濾器。當然默認的過濾器不會過濾任何行為,如果想過濾特定行為,則需要對過濾器進行重寫。
QObject類中定義的eventfilter():
1 virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );
此方法返回bool,過濾就返回true,否則flase。
重寫事件過濾器:
1 #include <QKeyEvent> 2 3 class MyEventFilter : public QObject { 4 public: 5 bool eventFilter( QObject *obj, QEvent *event ) override { 6 if ( event->type() == QEvent::KeyPress || 7 event->type() == QEvent::KeyRelease ) { 8 if ( ( (QKeyEvent *) event )->key() == Qt::Key_Escape ) { 9 qDebug("ESC press!"); 10 return true; 11 } 12 } 13 return false; 14 } 15 };
完成對事件過濾器的重寫后,需要在需要攔截的頁面進行安裝,如果是在子頁面(子進程)中進行安裝,那么它只在當前頁面生效,並不會影響到別的頁面,如果想在全局使用,那么就需要在第一個基頁面中安裝。安裝是調用QObject類中的一個方法。
QObject類中定義的安裝方法:
1 void QObject::installEventFilter ( QObject * filterObj )
全局過濾這個鍵盤事件:
1 QApplication a(argc, argv); 2 a.installEventFilter(new MyEventFilter);
最終效果:
Qt應用啟動期間,不會響應按壓ESC鍵,程序不會退出,完成了最初目的,類似操作可以攔截更多事件。