同時也會教大家一些元件化程式設計的思想,如何將做好的功能封裝成乙個個元件,以便在工程中復用。
作者「武威的濤哥」,從2023年開始參加工作,便入手了qml,參與了很多大大小小的qml專案,
至今已有五年多實戰經驗。
愛好者和開發者。
濤哥會堅持高質量和深入淺出的原則,將文章寫好,讓支援濤哥的讀者能夠受益匪淺。
系列文章中涉及的源**,絕大部分濤哥都會在github上開源。
如果覺得濤哥寫的還不錯,還請為濤哥打個賞,您的讚賞是濤哥持續創作的源泉。
哥交流,向濤哥提出建議和意見。
感謝大家!
豆子的文章前75章關於widget部分也很不錯。
qquick使用qml來描述介面,qml是可以與html5媲美的存在,其開發效率、舒適度、描述能力和定製化能力已經遠遠超
過了qwidget,配合各種屬性動畫、粒子系統和effects特效可以輕易做出各種酷炫、現代化的ui,不規則的圖形可以通
過painter的方式實現,對於渲染有效能要求的地方可以通過整合opengl、vulkan等圖形api的方式來處理。
qml的特性是自由和靈活,這也是它的缺點,上手qml需要一小段時間的適應,之後就會大量的造輪子,造的多了就輕車
熟路了,常見的各種二維介面或效果基本上都能造出來。
(當然qml中也有些bug,需要一定的經驗和技巧才能解決。話說回來,哪個框架沒點bug呢?)
再久一點,可以考慮考慮qml中的設計模式(或者叫慣用手法),如何抽象出通用qml庫、如何最大程度地復用qml
**、如何讓qml**更容易維護等。
qt發布的版本有很多,一般穩妥的做法是使用lts(長期支援版)版本的最後乙個修正版本。
當前已知的lts最新修正版本是5.9.8和5.12.3 , 濤哥會優先使用這兩個版本,後續有版本
要求的地方,濤哥都會進行額外的說明。
開始進入正題了
qml中已經有了現成的按鈕,在qtquick.controls模組中, 目前有兩個版本:
1.x的版本是通過style的方式進行定製
2.x的版本則是通過修改control屬性的方式進行定製
2.x版本的預設風格,還可以通過修改配置檔案qtquickcontrols2.conf中的style來修改
這裡順便說乙個經常有人問到的問題: 2.x版本中能否混用1.x版本的控制項?
答案是可以。只需要使用別名機制即可。(如果你看過qml的源**,就能輕易發現這個用法)
// mixcontrols.qml
import qtquick 2.0
import qtquick.controls 2.0 //匯入controls 2.0模組
import qtquick.controls 1.4 as qc14 //匯入controls 1.4模組,取別名qc14
import qtquick.controls.styles 1.4 as qcs14 //匯入controls.styles 1.4模組,取別名qcs14
rectange
qc14.button }}
預設的按鈕,很多時候並不能達到想要的效果,比如圓角、貼、漸變色的按鈕等等,還需要做很多的定製化工作
濤哥教大家造第乙個輪子,乙個帶文字的按鈕。
// taobutton.qml
import qtquick 2.0
import qtquick.controls 2.0
item
mousearea }}
}
使用qmlscene預覽一下效果
(gif錄製工具不能滑鼠懸浮,所以懸浮效果看不到,實際上是有懸浮效果的,可自行嘗試)
說明一下,qml中有個全域性的物件qt,它有一組調顏色的函式,qt.lighter和qt.darker,分別可以按係數來變淺和加深
乙個顏色值,這樣只要有了乙個顏色值,就能自動計算出深一點或者淺一點的顏色,可以減少很多配顏色的工作哦
再看一下這個表示式,當滑鼠按下去的時候,使用深一點的顏色,滑鼠懸浮的時候使用淺一點的顏色,其它情況就用設定的顏色
color: btnarea.pressed ? qt.darker(btncolor, 1.2) : (btnarea.containsmouse ? qt.lighter(btncolor, 1.2) : btncolor)
這裡的1.2是試出來的值,也可以使用其它值。
如果要帶個邊框呢?只要給rectange設定邊框的寬度和顏色就行了
property color btnbordercolor: "orange"
rectangle
如果要圓角呢? 只要給rectangle 設定radius就行了
rectangle
如果要圓形呢?只要給rectangle設定寬度和高度相等(正方形),radius是寬度的一半即可
rectangle
如果要背景色做成漸變的呢?
rectangle
gradientstop
gradientstop
}...
}
順帶提一下,5.12的rectangle,有了新的漸變色 漸變色**,大約有180種
可以直接在qml中使用。
gradient: gradient.nightfade //通過列舉使用
gradient: "sugarlollipop" //通過字串名字使用
為了能夠復用我們的按鈕,需要將它做成乙個元件。
這裡以文字按鈕為例:
// ttextbtn.qml
import qtquick 2.9
import qtquick.controls 2.0
rectangle
mousearea
}
qml元件,先以最簡單的方式理解,就是放在乙個單獨的qml檔案中,宣告一些屬性匯出,由使用者去例項化並設定屬性
比如這樣:
為了和標準的元件區分開,濤哥寫的元件名字都以大寫的t開頭。
元件化的好處,包括容易復用(如上圖,多個例項都不一樣)、可以統一修改(後面會有動態換**的方案,依賴於元件化)、
便於維護和擴充套件等。後續濤哥還會講如何做多層抽象的元件、單例元件、如何引用外掛程式中的元件等。
帶的按鈕,只需要把rectangle換成image即可。
為了應對各種按鈕狀態,濤哥做了以下的屬性擴充套件
// timagebtn.qml
import qtquick 2.9
import qtquick.controls 2.0
item
mousearea
}
有了前面的文字按鈕和按鈕,我們可以做乙個和文字都有的按鈕。
和文字同時顯示,那麼就有了布局問題。在左?還是在右?在上?還是在下?
濤哥這裡用了點技巧,封裝了乙個同時支援四種布局的**按鈕
// timgtextbtn.qml
import qtquick 2.9
import qtquick.controls 2.0
rectangle
text
//按布局型別 處理布局
component.oncompleted:
}mousearea
}
最後,我們來看看效果吧
從1開始的python
寫在前面 回到這次記錄的本身,因為之前我在公司寫了不少指令碼,然後分享給同事們參考使用,由於本身屬於額外的嘗試並且過程中沒有及時溝通和留下文件,所以沒有編碼經驗的同事會反饋比較頭大。因此所涉及到的常用功能會結合python語法進行分解,還是那句話,指令碼語言屬於用多了就能熟練的工具。先從需要什麼功能...
SOA研究 1 從NIO開始
最近在看dubbo原始碼,覺得dubbo還是設計很優秀。有個想法模擬dubbo去寫乙個soa框架。編寫soa框架,首先要解決底層傳輸問題,雖然dubbo預設是用netty傳輸,但是也是基於nio。所以我自己寫了nio程式設計例項,開始研究soa之路。實現功能很簡單,client傳送訊息給server...
為什麼C陣列下標從0開始,而不是從1開始
對於學習過程式語言的人來說,相信絕大多數人都會有這樣的疑問 我們平時計數,通常是從一開始計數的,為什麼在程式語言中,陣列的下標是從0開始計算的呢?這是因為,c語言中,下標的含意是 當前元素到第乙個元素的偏移量。第乙個元素的下標自然就是0,第二個元素的下標為1,第n個元素的下標為n 1。這樣處理能帶來...