日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

installEventFilter、eventFilter函数理解

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 installEventFilter、eventFilter函数理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
installEventFilter函數如下: void QObject::installEventFilter(QObject *filterObj)

Qt助手的解釋如下:

在對象上安裝一個事件過濾器filterObj。如下:

monitoredObj->installEventFilter(filterObj);

其中monitoredObj、filterObj都是QObject的子類。上面代碼意思是:在monitoredObj對象上安裝一個事件過濾器filterObj。該函數一般和如下函數配合使用:

[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

注意:該函數是虛函數,也就是說派生自QObject的子類可以重寫該函數。

? ? ?上面monitoredObj對象安裝一個filterObj過濾器后,則可以在filterObj對象所在類的eventFilter函數中攔截發送到monitoredObj對象的事件。如下為KeyPressEater類:

class KeyPressEater : public QObject{Q_OBJECT...protected:bool eventFilter(QObject *obj, QEvent *event) override;};bool KeyPressEater::eventFilter(QObject *obj, QEvent *event){if (event->type() == QEvent::KeyPress) {QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);qDebug("Ate key press %d", keyEvent->key());return true;} else {// standard event processingreturn QObject::eventFilter(obj, event);}}

現在我們在按鈕或QListView兩個窗體部件上安裝過濾器,如下:

KeyPressEater *keyPressEater = new KeyPressEater(this);QPushButton *pushButton = new QPushButton(this);QListView *listView = new QListView(this);pushButton->installEventFilter(keyPressEater);listView->installEventFilter(keyPressEater);

此時如果在按鈕或QListView獲取到鍵盤焦點時按下Esc鍵,按鍵事件被?KeyPressEater類的eventFilter函數攔截,從而彈出:

Ate key press 1048576

其中1048576為Esc鍵的虛擬鍵碼。Qt的QShortcut類就是采取這種技術實現的。

注意:

  • 事件過濾器對象filterObj能阻止(攔截)或放行發向對象monitoredObj的事件。
  • 事件過濾器對象filterObj通過其類的eventFilter函數來接收事件。
  • 如果過濾器對象filterObj所在類的eventFilter函數返回true,則該事件被攔截,也就是原本發向monitoredObj對象的事件不再發向monitoredObj對象;如果過濾器對象filterObj所在類的eventFilter函數返回false,則不攔截該事件,事件依然發向monitoredObj對象。
  • 如果同一個對象上安裝多個過濾器,則最后一個過濾器首先被激活調用。
  • 如果在eventFilter函數中刪除了接收事件的對象,請確保eventFilter函數返回true,否則Qt將會發送事件到刪除的接收對象上,這將導致程序崩潰。
  • monitoredObj對象和filterObj對象必須位于同一個線程中。如果filterObj對象在不同的線程,調用installEventFilter函數則Qt什么都不會做。
  • 如果調用installEventFilter函數后,monitoredObj對象和filterObj對象被移到不同的線程中去了,則eventFilter函數不會被調用,直到monitoredObj對象和filterObj對象回到同一線程時才會被調用。
  • 過濾器對象filterObj所在類的eventFilter函數的第一個參數是被攔截對象monitoredObj,即installEventFilter函數的調用者。以上面的?KeyPressEater例子來說,?KeyPressEater類的eventFilter函數的第一個參數是pushButton或listView

? ? ?

總結

以上是生活随笔為你收集整理的installEventFilter、eventFilter函数理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。