Qt攔截特定按鍵


轉自: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鍵,程序不會退出,完成了最初目的,類似操作可以攔截更多事件。


免責聲明!

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



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