大家好畸陡,我是吉米,這是一系列Qt Quick相關(guān)技術(shù)教程的首篇架忌。這個教程構(gòu)思已久吞彤,卻從未動手,被自己的拖延癥再一次折服叹放。不過好在工作中這方面的開發(fā)一直沒斷過饰恕,所以相關(guān)的經(jīng)驗也更多了。從現(xiàn)在開始井仰,讓我們一起開始學(xué)習(xí)吧埋嵌。
教程面向?qū)ο?/h2>
之前看到過一部講Qt Quick的書,叫《Qt Quick核心編程》俱恶,磚頭一本雹嗦,但翻了下實在忍不住吐槽:這哪里叫核心啊合是?這分明只是Quick Start之類的簡易教程了罪。可見現(xiàn)在技術(shù)界浮躁之甚聪全,自己沒怎么弄明白呢就開始出書了泊藕。我這個系列的教程本著知無不言童叟無欺的態(tài)度,結(jié)合我這兩年來生產(chǎn)環(huán)境中實踐所得难礼,力求講解清楚娃圆,深入淺出汽久。但是也需要作為讀者的你有以下基礎(chǔ):
- 有Qt編程基礎(chǔ),Widgets方面的就行踊餐;
- 有JavaScript基礎(chǔ),不需要精通臀稚,能看懂就行(完全不會的話先網(wǎng)上看看JS教程吧)吝岭;
- 有CMake基礎(chǔ),我們的例子都將以CMake構(gòu)建(而不是Qt自帶的qmake吧寺,原因后面講)窜管,所以沒用過CMake的同學(xué)請先了解下CMake的基本用法。
學(xué)習(xí)稚机、使用Qt Quick的起因
我從2016年初開始接觸Qt Quick幕帆。雖然從07年大二開始就用Qt,但一直停留在Widgets赖条,對QML這一塊好奇但沒敢碰失乾。究其原因一是覺得Widgets足夠好了,應(yīng)付日澄痴В科研開發(fā)足以碱茁;二是對JS這種腳本語言不是很感冒,因為在我的領(lǐng)域——信息安全仿贬、三維渲染——性能是最重要的纽竣。這樣一直過了2015年,我甚至沒用過Qt5茧泪。
事情在2016年發(fā)生了變化蜓氨。工作之后,公司交給我一個任務(wù)队伟,設(shè)計開發(fā)一個軟件框架穴吹,以改進(jìn)現(xiàn)有的軟件質(zhì)量。說實話缰泡,當(dāng)初是沒底的刀荒。一是沒做過什么軟件框架,二是我自己掌握的開發(fā)技術(shù)也不先進(jìn)啊棘钞。當(dāng)時公司已經(jīng)開始往Qt轉(zhuǎn)了缠借,而我被認(rèn)為是Qt方面的專家(捂臉)。然后有個同事問我會不會Qt Quick宜猜,我說不會泼返,有點尷尬。既然給了任務(wù)姨拥,就要認(rèn)真對待绅喉。我觀察到:
- 多種跡象表明渠鸽,Qml/Quick將是未來Qt著重發(fā)力的一塊,而Widgets被認(rèn)為Done柴罐,即已完成徽缚,未來不會再有新功能加入,只會對重要bug做修復(fù)革屠;
- 公司的狀態(tài)也已經(jīng)從生存到了想要提高用戶體驗的階段了凿试;
- 不少國際大廠的軟件設(shè)計已經(jīng)擺脫了傳統(tǒng)工業(yè)專業(yè)化軟件的那種刻板、簡陋似芝、復(fù)雜的風(fēng)格那婉,轉(zhuǎn)而向易用、扁平党瓮、響應(yīng)式详炬、美觀方向邁進(jìn)。
所以采用Quick構(gòu)建新一代軟件架構(gòu)似乎是順理成章的事寞奸。當(dāng)然還有一點:我是Qt專家呛谜,我怎么可以不會Qt最新技術(shù)呢?
但當(dāng)時別說國內(nèi)了枪萄,國外也沒多少Q(mào)t Quick這方面的技術(shù)文章呻率,StackoverFlow上沒記錯的話只有區(qū)區(qū)一百多個問題。沒辦法呻引,只能邊看Qt文檔邊實踐礼仗。于是風(fēng)風(fēng)火火、坑坑洼洼的Qt學(xué)習(xí)之旅開始了逻悠,時至今日已逾兩年元践。
技術(shù)優(yōu)勢
界面開發(fā)庫數(shù)量眾多,那從技術(shù)上講童谒,Qt Quick和Qt Widgets相比单旁,或者和其他界面庫例如wxWidgets、GTK+饥伊、duilib等相比如何呢象浑?
首先,我們將這些界面庫分分類琅豆,可以分為兩類:
- 傳統(tǒng)界面庫愉豺。包括Qt Widgets、wxWidgets茫因、GTK+這些蚪拦,通過對底層操作系統(tǒng)圖形界面的封裝來繪制窗體,實現(xiàn)跨平臺;
- 像素界面庫驰贷,用英文講叫Pixel UI盛嘿。包括duilib、CEGUI以及我們的主角Qt Quick括袒。這類界面庫直接調(diào)用底層顯卡接口次兆,操作顯存中的每個像素。它實際上是直接在這些像素中構(gòu)建出窗口組件锹锰、事件消息等上層邏輯概念类垦。
這兩類界面庫的對比如下:
傳統(tǒng)界面庫 | 像素界面庫 | |
---|---|---|
性能 | 高,依賴于CPU | 高城须,依賴于CPU、GPU |
原生樣式 | 高米苹,因為調(diào)用系統(tǒng)界面庫糕伐,所以擁有原生的界面樣式,和操作系統(tǒng)風(fēng)格一致 | 低蘸嘶,由于直接操作顯卡良瞧,不調(diào)用系統(tǒng)界面接口,需要自行模擬系統(tǒng)樣式 |
可擴(kuò)展性 | 弱训唱,由于系統(tǒng)界面庫的封裝褥蚯,想要改某些細(xì)微樣式非常困難 | 高,由于能操作每個像素况增,想怎么改就怎么改 |
移動平臺支持 | 弱赞庶,由于這些界面庫出道的時候,移動平臺還沒興起澳骤,所以在這些平臺上有些水土不服歧强,尤其是觸屏支持不好 | 高,設(shè)計之初就考慮了移動平臺为肮,OpenGL ES也支持完善 |
動畫摊册、響應(yīng)式支持 | 弱集绰,受限于系統(tǒng)界面庫的能力弃锐,要實現(xiàn)豐富柠偶、流暢的動畫比較困難 | 高养泡,由于底層就是對像素進(jìn)行操作榆纽,各種動畫就是對這些像素的一種宏觀邏輯上的變化龙宏,并不改變底層渲染的機(jī)制东亦,所以支持完善寝贡、流暢 |
穩(wěn)定性 | 高重斑,由于開發(fā)那么多年了熬荆,該發(fā)現(xiàn)的bug應(yīng)該差不多都發(fā)現(xiàn)了 | 弱,限于發(fā)展時間短,應(yīng)用范圍不廣卤恳,開發(fā)推進(jìn)快累盗,所以沒有傳統(tǒng)界面庫那么穩(wěn)定。 |
從上面的表格我們可以總結(jié)這兩類技術(shù)各自的適應(yīng)范圍:
- 傳統(tǒng)界面庫適合于專業(yè)性的突琳、工業(yè)型的程序若债,不要求花哨的界面,只要點下按鈕拆融、選擇菜單就能工作蠢琳,最重要的是穩(wěn)定、能如期提供需要的功能镜豹;
- 像素界面庫則適合于用戶體驗要求高傲须、講究使用流程的應(yīng)用,例如面向普通用戶的手機(jī)app趟脂、桌面軟件等泰讽,最重要的是使用流暢、美觀大方昔期,在不那么buggy的情況下偶爾出點小問題也是可以容忍的已卸。
從這個分析角度講,Qt Widgets適合于第一種情況硼一,而Qt Quick更適合于第二種情況累澡。而第二種情況正是當(dāng)時公司所想要轉(zhuǎn)型的方向。但這種區(qū)別也不是固定的般贼,目前Qt Quick出來也有些年數(shù)了愧哟,它的穩(wěn)定性已經(jīng)大好于從前;而工業(yè)界的軟件開發(fā)水平逐漸提高哼蛆,已經(jīng)從之前的只要work就行的需求提升到也講究用戶體驗的境界了(這個前面提過了)翅雏。同樣兩個功能完備的軟件,一個設(shè)計優(yōu)良人芽,一個毛毛糙糙望几,你說工程師更愿意用哪個?所以最終都是要講究用戶體驗的萤厅。
Qt Quick的這些技術(shù)優(yōu)勢正是我最終選擇它的原因橄抹。
開發(fā)環(huán)境
文章末尾還要交代下這個教程用的開發(fā)環(huán)境以及選擇原因:
名稱 | 版本號 | 原因 |
---|---|---|
Windows操作系統(tǒng) | Windows 10 64位 | 新系統(tǒng),比以前的好用(個人感覺) |
Qt | 5.9 for VS2015 64位 | 5.9是LTS版本(即Long Term Support惕味,長期支持)楼誓,更適合于生產(chǎn)環(huán)境 |
Visual Studio | 2015 Community,update 3 | 社區(qū)版是免費的名挥,而VS2015比之前的版本對C++11的支持好太多了 |
CMake | 3.9.6 | 很多類庫都提供CMake支持疟羹,而且公司內(nèi)已經(jīng)在推廣了 |
上面只是我自己在用的環(huán)境,不是必須一致的。但最好一樣榄融,減少很多環(huán)境差異導(dǎo)致的不一致情況参淫。
這篇文章就到這里了。下篇文章我們將馬上動手做一個簡單Quick程序愧杯,然后剖析這個程序的結(jié)構(gòu)涎才。敬請期待。