大家好,我是吉米,这是一系列Qt Quick相关技术教程的首篇。这个教程构思已久,却从未动手,被自己的拖延症再一次折服。不过好在工作中这方面的开发一直没断过,所以相关的经验也更多了。从现在开始,让我们一起开始学习吧。
教程面向对象
之前看到过一部讲Qt Quick的书,叫《Qt Quick核心编程》,砖头一本,但翻了下实在忍不住吐槽:这哪里叫核心啊?这分明只是Quick Start之类的简易教程。可见现在技术界浮躁之甚,自己没怎么弄明白呢就开始出书了。我这个系列的教程本着知无不言童叟无欺的态度,结合我这两年来生产环境中实践所得,力求讲解清楚,深入浅出。但是也需要作为读者的你有以下基础:
- 有Qt编程基础,Widgets方面的就行;
- 有JavaScript基础,不需要精通,能看懂就行(完全不会的话先网上看看JS教程吧);
- 有CMake基础,我们的例子都将以CMake构建(而不是Qt自带的qmake,原因后面讲),所以没用过CMake的同学请先了解下CMake的基本用法。
学习、使用Qt Quick的起因
我从2016年初开始接触Qt Quick。虽然从07年大二开始就用Qt,但一直停留在Widgets,对QML这一块好奇但没敢碰。究其原因一是觉得Widgets足够好了,应付日常科研开发足以;二是对JS这种脚本语言不是很感冒,因为在我的领域——信息安全、三维渲染——性能是最重要的。这样一直过了2015年,我甚至没用过Qt5。
事情在2016年发生了变化。工作之后,公司交给我一个任务,设计开发一个软件框架,以改进现有的软件质量。说实话,当初是没底的。一是没做过什么软件框架,二是我自己掌握的开发技术也不先进啊。当时公司已经开始往Qt转了,而我被认为是Qt方面的专家(捂脸)。然后有个同事问我会不会Qt Quick,我说不会,有点尴尬。既然给了任务,就要认真对待。我观察到:
- 多种迹象表明,Qml/Quick将是未来Qt着重发力的一块,而Widgets被认为Done,即已完成,未来不会再有新功能加入,只会对重要bug做修复;
- 公司的状态也已经从生存到了想要提高用户体验的阶段了;
- 不少国际大厂的软件设计已经摆脱了传统工业专业化软件的那种刻板、简陋、复杂的风格,转而向易用、扁平、响应式、美观方向迈进。
所以采用Quick构建新一代软件架构似乎是顺理成章的事。当然还有一点:我是Qt专家,我怎么可以不会Qt最新技术呢?
但当时别说国内了,国外也没多少Qt Quick这方面的技术文章,StackoverFlow上没记错的话只有区区一百多个问题。没办法,只能边看Qt文档边实践。于是风风火火、坑坑洼洼的Qt学习之旅开始了,时至今日已逾两年。
技术优势
界面开发库数量众多,那从技术上讲,Qt Quick和Qt Widgets相比,或者和其他界面库例如wxWidgets、GTK+、duilib等相比如何呢?
首先,我们将这些界面库分分类,可以分为两类:
- 传统界面库。包括Qt Widgets、wxWidgets、GTK+这些,通过对底层操作系统图形界面的封装来绘制窗体,实现跨平台;
- 像素界面库,用英文讲叫Pixel UI。包括duilib、CEGUI以及我们的主角Qt Quick。这类界面库直接调用底层显卡接口,操作显存中的每个像素。它实际上是直接在这些像素中构建出窗口组件、事件消息等上层逻辑概念。
这两类界面库的对比如下:
传统界面库 | 像素界面库 | |
---|---|---|
性能 | 高,依赖于CPU | 高,依赖于CPU、GPU |
原生样式 | 高,因为调用系统界面库,所以拥有原生的界面样式,和操作系统风格一致 | 低,由于直接操作显卡,不调用系统界面接口,需要自行模拟系统样式 |
可扩展性 | 弱,由于系统界面库的封装,想要改某些细微样式非常困难 | 高,由于能操作每个像素,想怎么改就怎么改 |
移动平台支持 | 弱,由于这些界面库出道的时候,移动平台还没兴起,所以在这些平台上有些水土不服,尤其是触屏支持不好 | 高,设计之初就考虑了移动平台,OpenGL ES也支持完善 |
动画、响应式支持 | 弱,受限于系统界面库的能力,要实现丰富、流畅的动画比较困难 | 高,由于底层就是对像素进行操作,各种动画就是对这些像素的一种宏观逻辑上的变化,并不改变底层渲染的机制,所以支持完善、流畅 |
稳定性 | 高,由于开发那么多年了,该发现的bug应该差不多都发现了 | 弱,限于发展时间短,应用范围不广,开发推进快,所以没有传统界面库那么稳定。 |
从上面的表格我们可以总结这两类技术各自的适应范围:
- 传统界面库适合于专业性的、工业型的程序,不要求花哨的界面,只要点下按钮、选择菜单就能工作,最重要的是稳定、能如期提供需要的功能;
- 像素界面库则适合于用户体验要求高、讲究使用流程的应用,例如面向普通用户的手机app、桌面软件等,最重要的是使用流畅、美观大方,在不那么buggy的情况下偶尔出点小问题也是可以容忍的。
从这个分析角度讲,Qt Widgets适合于第一种情况,而Qt Quick更适合于第二种情况。而第二种情况正是当时公司所想要转型的方向。但这种区别也不是固定的,目前Qt Quick出来也有些年数了,它的稳定性已经大好于从前;而工业界的软件开发水平逐渐提高,已经从之前的只要work就行的需求提升到也讲究用户体验的境界了(这个前面提过了)。同样两个功能完备的软件,一个设计优良,一个毛毛糙糙,你说工程师更愿意用哪个?所以最终都是要讲究用户体验的。
Qt Quick的这些技术优势正是我最终选择它的原因。
开发环境
文章末尾还要交代下这个教程用的开发环境以及选择原因:
名称 | 版本号 | 原因 |
---|---|---|
Windows操作系统 | Windows 10 64位 | 新系统,比以前的好用(个人感觉) |
Qt | 5.9 for VS2015 64位 | 5.9是LTS版本(即Long Term Support,长期支持),更适合于生产环境 |
Visual Studio | 2015 Community,update 3 | 社区版是免费的,而VS2015比之前的版本对C++11的支持好太多了 |
CMake | 3.9.6 | 很多类库都提供CMake支持,而且公司内已经在推广了 |
上面只是我自己在用的环境,不是必须一致的。但最好一样,减少很多环境差异导致的不一致情况。
这篇文章就到这里了。下篇文章我们将马上动手做一个简单Quick程序,然后剖析这个程序的结构。敬请期待。