一,前言
最近做了關于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框中輸入一個字符。最后事件傳遞的方法請參考下圖。
四,總結
之前的基于單片機的GUI引擎源碼看來沒有白學,發現原理都是相同的。沒想到QT GUI引擎也是類似的設計。這樣的一通百通的可遷移經驗就是靠平時不斷跨界累積的。
這讓我想到我所在的汽車零部件行業,adaptive autosar用的通信機制DDS和機器人ros中的DDS一樣。再想想現在汽車行業也要基于領域驅動設計(ddd)來定義微服務,這個是在向互聯網靠攏。可能這是互聯網造車新勢力帶來的概念。畢竟已經到了軟件定義汽車時代了。