5.QT事件處理機制--Apple的學習筆記

一,前言

最近做了關于QT界面窗口的刻意練習,推薦自己制作小工程則直接創建ui建立一個個窗口。若工程中ui多變,則考慮使用自動布局。而我之前還學習過QT繪圖相關,比如paintevent重繪等。那么我今天要復習下,并且QT的事件機制再系統的學習下。便于做出更靈活更高級的界面處理功能。

二,QT事件處理機制

直接看QT的Help,搜索Event Class可以看到QT支持很多事件,點擊The Event System可以了解其機制。并且網上也很多介紹資料。反正我都看了,之后我發現和我之前學習的littlevgl源碼中的GUI引擎是一個處理機制。
return a.exec();就是啟動了線程,進行事件掃描,一旦有對象事件發生,則會通過Event類傳給此對象。再仔細分析就是事件發生后保存到消息隊列,通過周期掃描消息對象,進行事件通知。這里等于是有一點點的延遲,update()就是將此paintEvent加入消息隊列,等待處理就是這樣的應用。信號和槽也是這樣的異步事件處理機制。另外一個是repaint立即重繪,則會直接調用paintEvent更新界面。所以paintEvent中可以加入update()但是不能加入repaint(),這會導致歸遞死循環。

三,QT事件傳遞順序

事件傳遞順序可以理解為也是層層歸遞的,先進入widget容器過濾事件,然后一層層進入到最上層的widget通知事件,并且調用事件處理的回調函數。最終再一層層從頂層向底層的widget傳遞事件。簡單來說是一個爬上到下山的過程。而一層層的控件,在最頂層的就是可以想象為在山頂,在最下方的容器類就是山底。
參考官網help,比如新建一個Widget類,再創建一個繼承QLineEdit的自定義類。在自定義的QLineEdit框中輸入一個字符。最后事件傳遞的方法請參考下圖。


image.png

四,總結

之前的基于單片機的GUI引擎源碼看來沒有白學,發現原理都是相同的。沒想到QT GUI引擎也是類似的設計。這樣的一通百通的可遷移經驗就是靠平時不斷跨界累積的。
這讓我想到我所在的汽車零部件行業,adaptive autosar用的通信機制DDS和機器人ros中的DDS一樣。再想想現在汽車行業也要基于領域驅動設計(ddd)來定義微服務,這個是在向互聯網靠攏。可能這是互聯網造車新勢力帶來的概念。畢竟已經到了軟件定義汽車時代了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、信號和槽 Qt中的事件處理機制叫“信號和槽”,signal和slot。模型:對象a中有一個信號signal:X...
    行走行囊閱讀 428評論 0 0
  • 簡介 這里簡單介紹Qt的一些核心機制,具體參見Qt文檔。 主要包含內容: Qt的信號和槽,以及事件機制 Qt Ob...
    QuietHeart閱讀 1,551評論 0 3
  • 為什么在頭文件中有的是使用前置聲明,而有的是包含頭文件? 如下代碼: 前置聲明(forward declarati...
    Joe_HUST閱讀 1,313評論 0 6
  • QObject三大核心功能:信號與槽,內存管理,事件處理 總覽 1、誰來產生事件: 最容易想到的是我們的輸入設備,...
    上官宏竹閱讀 2,783評論 2 4
  • 與界面編程緊密相關的就是事件處理機制,當用戶在程序界面上執行各種操作時,應用程序必須為用戶動作提供響應動作,這種響...
    GB_speak閱讀 2,327評論 0 3