一,前言
最近做了關于QT界面窗口的刻意練習,推薦自己制作小工程則直接創(chuàng)建ui建立一個個窗口。若工程中ui多變,則考慮使用自動布局。而我之前還學習過QT繪圖相關,比如paintevent重繪等。那么我今天要復習下,并且QT的事件機制再系統(tǒng)的學習下。便于做出更靈活更高級的界面處理功能。
二,QT事件處理機制
直接看QT的Help,搜索Event Class可以看到QT支持很多事件,點擊The Event System可以了解其機制。并且網(wǎng)上也很多介紹資料。反正我都看了,之后我發(fā)現(xiàn)和我之前學習的littlevgl源碼中的GUI引擎是一個處理機制。
return a.exec();就是啟動了線程,進行事件掃描,一旦有對象事件發(fā)生,則會通過Event類傳給此對象。再仔細分析就是事件發(fā)生后保存到消息隊列,通過周期掃描消息對象,進行事件通知。這里等于是有一點點的延遲,update()就是將此paintEvent加入消息隊列,等待處理就是這樣的應用。信號和槽也是這樣的異步事件處理機制。另外一個是repaint立即重繪,則會直接調(diào)用paintEvent更新界面。所以paintEvent中可以加入update()但是不能加入repaint(),這會導致歸遞死循環(huán)。
三,QT事件傳遞順序
事件傳遞順序可以理解為也是層層歸遞的,先進入widget容器過濾事件,然后一層層進入到最上層的widget通知事件,并且調(diào)用事件處理的回調(diào)函數(shù)。最終再一層層從頂層向底層的widget傳遞事件。簡單來說是一個爬上到下山的過程。而一層層的控件,在最頂層的就是可以想象為在山頂,在最下方的容器類就是山底。
參考官網(wǎng)help,比如新建一個Widget類,再創(chuàng)建一個繼承QLineEdit的自定義類。在自定義的QLineEdit框中輸入一個字符。最后事件傳遞的方法請參考下圖。

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