詳解關於Qt中Event事件處理流程

來源:互聯網
上載者:User

QtEvent處理流程是本文要介紹的內容,主要是來瞭解Event事件的處理。在Qt/Embedded中,滑鼠事件來自於觸控螢幕裝置。在使用select讀取觸控螢幕裝置中的資料後即採樣,壓力達到一定閾值),處理些採樣點後得到一個物理裝置座標點,然後用QCoreApplication的sendEvent活postEvent將其發送出去,於是Event的處理流程就開始了。

首先,QCoreApplication::notify將event直接傳遞給接受者。重新實現它,可以截取系統所有需要處理的事件。

其次,在使用notify通知接受者處理後,可以為application的執行個體qApp安裝一個event filter,它將處理應用程式範圍內的事件。

第三,event在經過application的處理後,到達QObject的event filter列表,為接收者者們安裝event filter,將只處理髮給自己的各個事件。

第四,在經過上述處理後,event到達QObject的event函數。該函數處理髮送給自己的event,如QWidget中它按照event類型分發給自己的各個event Handler,如MouseReleaseEvent,KeyPressEvent等。

最後,是處理不同類型event的event handler。這也是經常使用的,它只處理自己的event。 

過程如下:

 
  1. bool QCoreApplication::notify (   
  2. QObject   
  3. * receiver, QEvent   
  4. * event   
  5. )  
  6. ->qApp  
  7. 的  
  8. event filters->object  
  9. 的  
  10. event filter->object  
  11. 的event()  
  12. 函數->object  
  13. 的各  
  14. event handler  
  15.  

在以上處理過程中,返回true表示中止事件的處理,返回false則繼續。

父子表單傳遞關係:

對於構成parent-child關係的QWidget,事件將首先傳遞給child,在子表單做出ignore後將繼續傳遞給父表單,若是accept,將終止傳
遞。若我們想截獲發給父表單容器中的各個子孫)表單的event,可以使用QObject::findChildren尋找出child列表,為其安裝event filter。比如自己重載eventfilter函數,然後安裝它就行了。當然,也可以在繼承的子類的event handler中ignore後讓父表單繼續處理,但這不是截獲。
 
注意:根據Qt文檔,安裝的event filter不支援另外一個線程中執行的object。

應用執行個體:
 
FileBrowser中包含有多個QPushButton和一個QFrame,QFrame包含一個QStackedWidget,後者包含一個QListView和一個QTreeView兩個widget它們是)。Filebrowser實現了eventFilter,並在FileBrowser的建構函式中安裝它們:   

 
  1. this->installEventFilter(this);  
  2. listView->installEventFilter(this);//not work,why?  
  3. treeView->installEventFilter(this);//not work,why?  
  4. QList<QPushButton*> allButtons = this->findChildren<QPushButton *>();  
  5. foreach(QPushButton* button, allButtons)  
  6.  button->installEventFilter(this);  

運行結果如下:

 
  1. obj name1:FileBrowserListView, type: 8  
  2. event filter: pid=6273 tid=-1208457520  
  3. ListView::mouseReleaseEvent: pid=6273 tid=-1208457520 

問題:

前兩行為eventfilter中的輸出結果:表示截取到了發往ListView的事件類型為8,FocusIn事件)。而第三行則是listView的event handler的輸出,它能夠處理mouse、release事件,但event filter並未捕獲到它,但可以捕獲到焦點的得失事件。輸出的線程號也是相同的。

為什麼event filter不能捕獲兩個view上的滑鼠點擊事件,但可以擷取其它事件如FocusIn與FocusOut呢?

其中輸出log的代碼是:

 
  1. #include<unistd.h>   
  2. //#include<sys/types.h> 
  3. #include <pthread.h> 
  4. ...  
  5.  fprintf(stderr, "ListView::mouseReleaseEvent: pid=%d tid=%d\n",::getpid(), (unsigned int)::pthread_self()/*::gettid()*/); 

小結:詳解關於QtEvent處理流程的內容介紹完了,希望通過本文的學習能對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.