玩轉Qml 1 從按鈕開始

2021-10-13 07:23:08 字數 4521 閱讀 1353

同時也會教大家一些元件化程式設計的思想,如何將做好的功能封裝成乙個個元件,以便在工程中復用。

作者「武威的濤哥」,從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。這樣處理能帶來...