Qt Quick与Qt Widget的比较

107

我是新手对Qt不太了解,不太清楚Qt Quick项目和Qt Widget项目的区别。

我希望创建一个程序,绘制一个六边形的晶格,用户可以旋转、剪切、平移和缩放。它最终将成为一个MIDI控制器。哪种类型的项目更适合这个目的,为什么?

我希望它能在桌面和移动平台上运行。


3
请花点时间浏览Qt Quick网站上的示例。如果符合您的需求,请使用它。如果不符合,请考虑普通的Qt小部件项目,但移动平台可能会有问题。 - Mat
Mat的评论更新链接 https://doc.qt.io/qt-5/qtquick-index.html - Ayxan Haqverdili
Ayxan Haqverdili的评论更新链接:doc.qt.io/qt-6/qtquick-index.html - bturner1273
5个回答

76

注意:在本答案中,“Qt Widgets”指的是创建新的Qt应用程序时可选择的Qt Widgets应用程序。

这是问题首次发布七年后...但是这里是我的“客观”两分钱,以抵消此后的任何发展。

复习

语言

Qt Quick项目使用QML和JavaScript。后者承载了程序逻辑的大部分:事件操作(Component.onCompletedonClicked等),数学等。

Qt Widgets项目使用C++代码。(PyQt和PySide是Qt的Python绑定)。

性能和编码

因此,与Qt Quick相比,Qt Widgets可以被认为是低级的。但这意味着从长远来看,Qt Widgets项目将运行更快,性能更好。低级别可能也有好处,因为Qt Widgets更暴露于本地API(QtCore模块等)。尽管如此,它通常用于桌面开发。

Qt Quick适用于桌面和移动开发。它具有现成的popupsanimations、选项卡和布局、flickablesdrawers以及通常在移动开发中普遍存在的控件。
外观与感觉方面,如前所述,Qt Widgets更接近本地外观和感觉,因此样式默认为本地外观和感觉。您可以使用Qt Style Sheets来增强您的小部件,但这些仍然是有限的。
在样式方面,Qt Quick更加灵活。一个有趣的案例研究是MuseScore。在从版本3迁移到4时,MuseScore将许多UI组件从Qt Widgets更改为Qt Quick / QML。为什么?因为野心勃勃的UI / UX设计。使用Qt Quick实现弹出窗口(以及其他内容)更加方便。(来源:Tantacrul on MuseScore 4,8:08-9:30)
UI设计。
两者都有使用QtDesigner的ui文件,提供了一个高层次的视图来设置布局和创建接口。这也使得那些对编程知之甚少的设计师可以施展他们的魔法。(在Qt Quick中,扩展名是.ui.qml。在Qt Widgets中,它们是.ui。)不必使用.ui文件;你仍然可以选择使用QML/JS或C++/Python来以编程方式设计UI。
学习
如果您完全不懂编程,我建议先看一下Qt Quick。个人认为,Qt Quick具有更温和的学习曲线,并且更容易用于完成无数项目。它被称为“Qt Quick”是有原因的。(不要小看Qt Widgets,它们有一些很好的模块,比QtQuick更出色。)
然而,如果您之前使用过C++或Python进行编程,我建议先看一下Qt Widgets,以熟悉它们的信号和槽机制和可能感兴趣的模块(例如sql, network, gui),以及编程设计(例如用于显示数据的model/view programming)。
特别是对于C++,大多数不使用Qt处理事件的库都使用while-loop,但Qt不是这种情况。它们使用信号和槽
最终,即使您主要使用Qt Widgets,您也可能想查看Qt Quick,因为它提供了一个高级声明性语言来工作,并允许您更快地设置事物。(特别是针对移动开发。)
Qt提供了丰富的示例,涵盖Qt QuickQt Widget项目,并提供论坛支持。您不必担心长期获取帮助。(别忘了StackOverflow!)

Qt Quick + Qt Widget

到目前为止,我们一直将它们视为独立实体。但是可以将QML集成到C ++中。这使您能够利用Qt Widget、C++和其他模块。例如,QtQuick提供了TreeView,但没有TreeModel,应该从C ++中注册到QML中。通常有一个关注点分离的说法,其中Qt建议将程序分为UI和逻辑分别放入QML和C ++中。
如果需要进行强大的SQL查询、算法或异步http/xml请求,则这也非常方便。酷吧?QML/JS前端加上C++后端。全栈Qt'er。 :-)

谢谢,这是一个有用的介绍Qt中UI选项的内容。 - Vladimir
1
Qt Quick 允许热重载,参见 qhotHot reload QML when using ApplicationWindowfelgo live - milahu
qtdeclarative(用于Qt Quick)是一个庞大的依赖项->运行时大小,捆绑包大小 - milahu

45

注意: Qt Widgets已被QML Widgets取代; 本答案回答的是关于旧版Qt Widgets的历史问题。

Qt Quick是一种声明式、智能手机风格的用户界面,支持许多常见于智能手机应用程序的酷炫动画过渡效果。Quick也是快速开发原型的不错选择。而Qt Widget是传统的桌面定向UI模型。

目前(Qt5之前),Qt Quick对桌面系统功能的支持尚不足(但正在改进)。在Quick中,菜单、工具栏、对话框和其他标准桌面行为的支持不如Widget,而Widget非常擅长支持这些元素。

您想让您的应用程序在桌面和平板电脑平台上看起来和感觉像本地应用程序,还是在您自己的自定义UI部件周围构建一个简单的应用程序?正如Mat所说,如果Qt Quick支持您想要的功能,那可能是您最快的方法。如果您想构建功能完整的桌面版本,则Qt Widget可能是最好的选择。


1
我都想要。:) 目前使用 Qt Widget。 - Anthony
11
这个回答应该被删除、编辑或者下降投票,因为我们现在已经过了Qt 5.0的时代,甚至快要迎来6.0版本,而Qt Widgets已经被QML Widgets所取代。 - Ariel M.
23
QML并不是Qt Widgets的替代品,即使在2019年至今也是如此,除非它能取代Qwt、QCustomPlot等一些项目,但似乎并非如此。目前,它只是一种实现方式,没有更多也没有更少。 - Andry
2
@Ariel M. Qt Widgets没有被取代,也不可能被取代,至少在一切都被重写之前是这样的,而现在并非如此。 - Andry
1
Qwt和QCustomPlot是第三方项目,不属于QtWidgets的一部分,因此它们是否被移植与此无关。此外,Anthony是新手,他想要创建一个需要高度自定义UI的MIDI控制器(请参见Arena、Lemur PS Elements和类似软件)。QML是正确的选择。 - Ariel M.
显示剩余5条评论

42
作为一名专业的qt应用程序开发者,我会选择qml而不是widgets。 Widgets适用于非常基本的东西,但是一旦你需要创建更复杂的东西,widgets很快就会变得不够用了。 Qml更加灵活,可以在任何位置锚定项目,而不是使用有限的widget布局系统。几乎没有平台依赖性缺陷,而widgets则充满这些问题。属性绑定系统使保持ui与模型同步变得非常容易。

3
谢谢!基于你在答案中提到的专业背景,我决定开始学习QML/QtQuick。刚刚意识到我可以轻松地使用QtCreator生成的*.ui.qml文件并直接在PyQt中使用它们。解决了我Python + QtQuick的初始设置问题! - swdev
2
在复杂的桌面程序中使用QtQuick会影响性能,这不是一个好主意。 - Yousha Aleayoub
2
也许你对布局API的经验还不够?有没有什么关于QML的例子,是用Widgets无法实现的?我在全球拥有10Ks用户的应用程序上使用Qt已经超过5年了,我们使用Widgets,因为只有它们提供了无限的能力。 QML适用于原型和小型项目。而且,性能很重要。此外,由于QML是基于OpenGL驱动的,如果您的用户群体中充满旧硬件,这将成为一个停滞因素。 - Dalamber
目前的硬件配备通常不支持OpenGL,例如大多数笔记本电脑GPU。 - Alan B
1
@AlanB,我可以问一下现在哪些笔记本电脑的GPU不支持OpenGL吗? - Sentouki
唉,Qt Quick不再依赖OpenGL了。它可以从光栅化转换到OpenGL、Vulkan或DirectX。QML赢了! - Ariel M.

8

首先,我认为你应该从Widget开始。Widget UI有助于更容易地学习qt,如果您之前的经验是关于前端事物,您将更容易地学习Quick。


7
Qt Quick默认采用内置ECMAScript的QML,这是一种JSON声明性方言。针对Qt窗口部件,设计师可以制作样式表,而开发人员则需要进行C++编码。
运行时处理QML。在框架内,所有内容都可以同时运行,不同之处只是增加了软件架构决策的灵活性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接