当前位置: 首页 > 工具软件 > Qt# > 使用案例 >

二选一的时候到了,Qt Widgets 还是 Qt Quick ? 致Qt开发伙伴

孔瑾瑜
2023-12-01

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

我们都知道,我们网校的大部分PC客户端软件都是采用基于Qt的应用程序开发框架来实现的。其中,对于客户端软件,全部或部分使用Qt Widgets控件进行界面开发展示。所以,现在几乎所有的PC端开发伙伴都知道Qt QWidgets是什么,对基于Qt QWidgets 开发界面程序的流程也都熟稔于心。

但是从Qt 4.7开始,引入了Qt Quick技术,在Qt 5之前,Qt Quick 作为一个新兴的技术,加上当时有各种不完善,所以并没有成为主流的开发框架。但随着 Qt5 的到来,Qt Quick 也进行了很多优化和改进,也发布了Qt Quick 2.0。越来越多的项目也开始选择 Qt Quick 作为开发首选项,而不是Qt QWidgets。

现在很多Qt的初学者、熟练使用Qt QWidgets开发老师甚至有使用Qt Quick 开发经验的老师,对于Qt Quick到底是什么,和 Qt QWidgets有什么区别?对于新学者应该学习哪一种?项目中应该选用Qt QWidgets 还是 Qt Quick 这些问题,一时也分的不是特别清楚,也讲得不是特别明白。


提示:以下是本篇

今天我们就一起探讨一下上面那些问题,重点弄清楚两个问题:

1. Qt QWidgets 和 Qt Quick 各自有什么特性、特点?

2. 开发一款软件的时候,我们应该选用Qt QWidgets 还是 Qt Quick 哪种技术?

为了弄清上面的问题,我们首先应该先了解Qt QWidgets 和 Qt Quick 各自都是什么?国际惯例,先上定义。我们先说一下 Qt Quick : 在官方文档里对它的描述是这样的:

一种高级用户界面技术,可以轻松创建供移动和嵌入式设备使用的动态触摸式界面和轻量级应用程序。Qt Quick主要由一个改进的Qt Creator IDE(其中包含了Qt Quick设计器)、新增的简单易学的QML语言和新加入Qt库中名为QtDeclarative的模块等三部分组成。这些使得QML更方便不熟悉C++的开发人员和设计人员使用。

从这个定义来看,其实Qt Quick就是Qt引入的全新的界面编程方式的通称。在Qt 5中,Qt Quick被描述为QML类库:Qt Quick是QML的一个数据类型和功能的标准库,包含了可视化类型、交互类型、动画、模型和视图、粒子特效和渲染特效等。在QML应用程序中,可以通过一个简单的import语句来使用该模块提供的所有功能。

这里面又提到了 QML,那么什么是QML?

我们看一下官方对它的定义:

QML(Qt Meta-Object Language,Qt元对象语言)是一种用于描述应用程序用户界面的声明式编程语言。它使用一些可视组件,通过这些组件之间的交互来描述用户界面。QML是一种高可读性的语言,可以使组件以动态方式进行交互,并且易于复用和自定义。QML允许开发者和设计者进行联合创作,快速创建高性能的、具有流畅的动画效果的、极具视觉吸引力的应用程序。QML提供了一个具有高可读性的类似 JSON 的声明式语法,并提供了必要的 JavaScript 语句和动态属性绑定的支持。

 在Qt 5中,QML语言和引擎框架由Qt QML模块提供。

看完之后是不是还没有搞清楚 什么是 Qt Quick? 甚至更迷糊了呢?哈哈,定义总是那么的生涩且难以理解,不过如果是初学者,你可以把 QML 和 Qt Quick 的关系想象成C++ 和 Qt 的关系。 如果还不理解,没关系,往下看,等到我们把他们的特性也梳理完了,也许对你的帮助会比较大。

说完 Qt Quick 的定义之后,我们来说一下 Qt QWidgets 的定义又是什么呢?由于官方对它没有明确的定义,大家也没有形成一个明确的文字定义,但是有过Qt开发经验的人,应该都明白: Qt QWidgets 就是使用Qt 提供的一些开箱既见、所见即所得的一些基础控件,并且非常依赖主流语言(C++或Python等)API的一种界面开发框架。

一、Qt QWidgets 和 Qt Quick 各自有什么特性、特点

好了,我们上面知道了 Qt QWidgets 和 Qt Quick 各自是什么,那么我们就可以进入第一个正题了,我们来讨论一下他们各自的功能,我们先从Qt QWidgets 开始:Qt QWidgets 和 Qt Quick 的特性,先总结一下Qt QWidgets:

1.Qt QWidgets

  1. Qt QWidget 仅可用于基于主流语言的API,比如C++和Python,并不依赖于其他环境。
  2. 开箱即用,Qt 本身提供很多,看起来就像Windows等桌面平台的原生控件(但在移动平台,如Andriod 和 IOS 上,并没有对应原生风格的小组件,与原生控件差别还是很大的),因此,如果我们需要一些无需任何额外的原生控件,那么选择Qt QWidgets 是一种不错的选择。
  3. 虽然 Qt QWidgets 在PC平台上会提供一些开箱即用的、接近于原生风格的控件,但是,我们可以通过设置样式表,来改变小组件的外观,绝大多数情况下,是可以达到我们想要的效果的。例如使用QStyle 或者基于 CSS 的样式表,都能够比较轻松地达到我们想要的样式。
  4. Qt QWidgets 并不依赖于 OpengGL Metal 或者其他图形渲染后端,因为Qt 用自己的绘画类(QPainter)实现渲染。尽管我们还可以根据需要设置为渲染OpenGL Metal 等窗口包装到小部件层次结构中,因此也没有限制。
  5.  我们还可以通过子类化,或者编写自己的控件,来根据需求,定制小组件的行为和样式。
  6. Qt QWidgets 通常不用来做动画效果。虽然我们可以通过编写代码实现复杂的动画,但是编码过程往往会非常的难,非常的复杂。即便我们强行实现了要求的动画效果,也不一定是我们想要的或者非常流畅的UI动画,有时候动画伴随的是复杂的计算,CPU的飙升,带来的往往会不同程度的卡顿。

2.Qt Quick

  1. Qt Quick 通常使用基于JS的 QML 来编写代码,但是仍然需要一些基于C++ 或者Python 的代码来帮助通讯,例如连接到后端。(有JS开发经验的小伙伴上手会比较快)
  2. Qt Quick 可以在所有平台上使用,并使用原生图形后端进行渲染,比如Metal 或者 Mac OS, 我们也可以在自己为Qt Quick编写的项目中,直接使用原生图形系统进行渲染,对硬件资源利用率更高。
  3. 使用 Qt Quick可以更容易的实现流畅的用户界面,以及复杂的动画效果。这也意味着,我们无需消耗太多精力去实现图形效果和动画就能实现想要的。
  4. 通过现有的控件或基本的Qt Quick 类型,我们也可以定制或者编写自己想要的控件。
  5. 我们通过查看最新版本的Qt6 也发现,可以在移动端上使用Qt Qt Quick Controls 为基础的控件的原生外观了。例如再Andriod 上,可以获取当前主题信息,并进行对应的外观调整了。这对于以后想用Qt用于移动端的开发的老师是个好消息,可以使应用程序的用户界面开起来像原生应用程序一样,开发起来也会变得更加容易一些。

二、开发一款软件的时候,我们应该选用Qt QWidgets 还是 Qt Quick 哪种技术?

二、如何选择

通过上面的总结,我们知道了Qt QWidgets 和 Qt Quick 的各自特性之后,我们可以讨论第二个问题了 “开发一款软件的时候,我们应该选用Qt QWidgets 还是 Qt Quick 哪种技术?”

其实我们发现针对桌面系统软件开发的时候,用Qt QWidget 还是 Qt Quick, 其实是根据我们软件的需求来决定的。一般有一下几点建议:

  1. 如果我们需要一个快速、简单的UI,对动画效果要求不高的话,使用Qt QWidget 绝对是个不错的选择。它有很多现成的组件可以使用,根据需求进行拼装即可,无需太多操作。
  2. 如果我们不是太了解JS,并且需要开发一个桌面应用,那选择使用Qt QWidget 上手,肯定是迄今为止最容易使用的工具了。
  3. 不过如果我们想要更加炫酷的界面,更加流畅的动画,我们就最好使用Qt Quick 了。
  4. 如果我们将来想使用Qt for MCUs 开发,那么我们只能够选择Qt Quick了。
  5. 如果我们是用来进行移动设备(Andriod 或者IOS)、嵌入式设备开发,那么最好使用Qt Quick,因为相对于Qt QWidgets 而言,它可以更好的利用有限的资源,尽管我们可以再这些设备上使用小组件,但是在性能方面,Qt Quick 可以使用本地图形渲染器,也就是说,我们的应用程序性能会更加出色,动画或者动态效果会更加流畅6. 如果我们要跨平台开发,最好还是使用Qt Quick, 因为使用Qt QWidgets 你需要在不同的平台做不同的UI风格,而使用Quick则不会。

总结

到这里,我们就把今天重点讨论的两个问题说明白了,再总结一下,就是

1. Qt QWidgets 和 Qt Quick 都是跨平台的,相对而言,Qt QWidgets 是一种更老、更成熟的框架(方案),Qt Quick 则更新,更现代一些。

2. 想要快速简单的构建一个无需绚丽动画的传统桌面程序,优先使用Qt QWidgets。

3. 想要绚丽界面和动画,或者移动端程序、跨平台程序建议优先使用Qt Quick。

随着Qt Quick的持续发展,未来的桌面开发程序,会越来越多的使用Qt Quick 技术的,希望各位老师有空也能够多学习一下相关知识。

 类似资料: