一,前言
最近做了關(guān)于QT界面窗口的刻意練習(xí),推薦自己制作小工程則直接創(chuàng)建ui建立一個(gè)個(gè)窗口泌绣。若工程中ui多變述暂,則考慮使用自動(dòng)布局。而我之前還學(xué)習(xí)過QT繪圖相關(guān)叨橱,比如paintevent重繪等典蜕。那么我今天要復(fù)習(xí)下,并且QT的事件機(jī)制再系統(tǒng)的學(xué)習(xí)下罗洗。便于做出更靈活更高級(jí)的界面處理功能愉舔。
二,QT事件處理機(jī)制
直接看QT的Help伙菜,搜索Event Class可以看到QT支持很多事件轩缤,點(diǎn)擊The Event System可以了解其機(jī)制。并且網(wǎng)上也很多介紹資料贩绕。反正我都看了火的,之后我發(fā)現(xiàn)和我之前學(xué)習(xí)的littlevgl源碼中的GUI引擎是一個(gè)處理機(jī)制。
return a.exec();
就是啟動(dòng)了線程淑倾,進(jìn)行事件掃描馏鹤,一旦有對(duì)象事件發(fā)生,則會(huì)通過Event類傳給此對(duì)象踊淳。再仔細(xì)分析就是事件發(fā)生后保存到消息隊(duì)列假瞬,通過周期掃描消息對(duì)象陕靠,進(jìn)行事件通知。這里等于是有一點(diǎn)點(diǎn)的延遲脱茉,update()就是將此paintEvent加入消息隊(duì)列剪芥,等待處理就是這樣的應(yīng)用。信號(hào)和槽也是這樣的異步事件處理機(jī)制琴许。另外一個(gè)是repaint立即重繪税肪,則會(huì)直接調(diào)用paintEvent更新界面。所以paintEvent中可以加入update()但是不能加入repaint()榜田,這會(huì)導(dǎo)致歸遞死循環(huán)益兄。
三,QT事件傳遞順序
事件傳遞順序可以理解為也是層層歸遞的箭券,先進(jìn)入widget容器過濾事件净捅,然后一層層進(jìn)入到最上層的widget通知事件,并且調(diào)用事件處理的回調(diào)函數(shù)辩块。最終再一層層從頂層向底層的widget傳遞事件蛔六。簡(jiǎn)單來說是一個(gè)爬上到下山的過程。而一層層的控件废亭,在最頂層的就是可以想象為在山頂国章,在最下方的容器類就是山底。
參考官網(wǎng)help豆村,比如新建一個(gè)Widget類液兽,再創(chuàng)建一個(gè)繼承QLineEdit的自定義類。在自定義的QLineEdit框中輸入一個(gè)字符掌动。最后事件傳遞的方法請(qǐng)參考下圖四啰。
四,總結(jié)
之前的基于單片機(jī)的GUI引擎源碼看來沒有白學(xué)坏匪,發(fā)現(xiàn)原理都是相同的拟逮。沒想到QT GUI引擎也是類似的設(shè)計(jì)。這樣的一通百通的可遷移經(jīng)驗(yàn)就是靠平時(shí)不斷跨界累積的适滓。
這讓我想到我所在的汽車零部件行業(yè)敦迄,adaptive autosar用的通信機(jī)制DDS和機(jī)器人ros中的DDS一樣。再想想現(xiàn)在汽車行業(yè)也要基于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(ddd)來定義微服務(wù)凭迹,這個(gè)是在向互聯(lián)網(wǎng)靠攏罚屋。可能這是互聯(lián)網(wǎng)造車新勢(shì)力帶來的概念嗅绸。畢竟已經(jīng)到了軟件定義汽車時(shí)代了脾猛。