【问题标题】:Qt Quick vs. Qt Widget [closed]Qt Quick 与 Qt Widget [关闭]
【发布时间】:2026-01-20 21:50:01
【问题描述】:

我是 Qt 新手,不太了解 Qt Quick Project 和 Qt Widget Project 之间的区别。

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

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

【问题讨论】:

  • 花点时间在Qt Quick 网站上查看示例。如果这是您需要的,请使用它。如果没有,请使用普通的 Qt 小部件项目,但移动平台可能会是一个问题。
  • 更新了 Mat 评论的链接doc.qt.io/qt-5/qtquick-index.html

标签: qt qt-quick qtwidgets


【解决方案1】:

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

这是该问题首次发布七年后...但这是我的“目标”两美分,以抵消此后的任何发展。

复习

语言

Qt Quick 项目使用 QML 和 JavaScript

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

性能和编码

因此,与 Qt Quick 相比,Qt Widgets 可以被认为是低级的。但这意味着从长远来看,Qt Widgets 项目会运行得更快,性能更好。不过,低级可能是件好事,因为 Qt Widgets 更多地暴露于原生 API(QtCore moduleQt Style Sheets 等)。也就是说,它通常用于桌面开发。

Qt Quick 更适合移动开发(尽管它仍可用于桌面开发)。它具有即用型popupsanimations、选项卡和布局、flickablesdrawers 和常用控件;在移动开发中无处不在。

界面设计

两者都有 ui 文件,可与 QtDesigner 一起使用,为设置布局和创建界面提供高级视图。 (在 Qt Quick 中,扩展名是 .ui.qml。在 Qt 小部件中,它们是 .ui。).ui 文件不是强制性的,也不是必需的:您可以选择使用 QML/JS 或 C++/ 以编程方式进行设计和布局蟒蛇。

学习

如果您是完全编程新手,我建议您先看看 Qt Quick。就个人而言,我认为 Qt Quick 具有更温和的学习曲线,并且更容易完成无数项目。它被称为“Qt Quick”是有原因的。 (不过不要小看 Qt Widgets,它们有一些比 QtQuick 更出色的模块。)

但是,如果您以前使用过 C++ 或 Python 进行编程,我建议您先看看 Qt Widgets,以习惯它们的 signals and slot mechanism 和您可能感兴趣的模块(例如 sql、@987654330 @, gui) 以及编程设计(例如 model/view programming 用于显示数据)。

特别是对于 C++,大多数进行事件处理的非 Qt 库都使用while-loops,而 Qt 则不是这种情况。他们使用signals and slots

最后,即使您主要使用 Qt 小部件,您也可能希望查看 Qt Quick,因为它提供了一种高级声明性语言可供使用,并允许您更快地进行设置。 (特别是对于移动开发。)

Qt 为Qt QuickQt Widget 项目以及forum 提供了大量示例。从长远来看,您不必担心获得帮助。 (别忘了 *!)

Qt Quick + Qt 小部件

到目前为止,我们一直将它们视为独立的实体。但是可以integrate QML into C++。这使您可以利用 Qt Widget、C++ 和其他模块。例如,QtQuick 提供了一个TreeView,但不提供TreeModel,它可以/应该从 C++ 注册到 QML。通常有一个separation of concerns 的宣传,Qt 建议将程序分成 UI,将逻辑分别分成 QML 和 C++。

这也很方便,如果说您需要一个后端来处理密集的 SQL 查询、算法或异步 http/xml 请求。那不是很酷吗? QML/JS 前端加上一个 C++ 后端。全栈 Qt'er。 :-)

(我没有尝试过,有一个 Python 后端。我还没接触过 PyQt...)

【讨论】:

  • 谢谢,这是对 Qt 中 UI 选项的有用介绍。
【解决方案2】:

注意: Qt Widgets 已被 QML Widgets 取代;这个答案回应了所提出的问题,现在严格来说这是一个关于旧 Qt 小部件的历史问题。

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

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

您希望您的应用在桌面和平板电脑平台上具有原生的外观和感觉,还是围绕您自己的自定义 UI 小部件构建一个简单的应用?正如 Mat 所说,如果 Qt Quick 支持您想要的功能,那可能是您最快的方法。如果您想构建功能齐全的桌面版本,Qt Widget 可能是您的最佳选择。

【讨论】:

  • 我都想要。 :) 现在使用 Qt Widget。
  • 这个答案应该被删除、编辑或否决,因为我们现在处于 Qt 5.0 后,我们甚至接近 6.0,Qt 小部件已被 QML 小部件取代。
  • QML 不是 Qt Widgets 的替代品,即使在 2019 年也是如此,至少在它替代 Qwt、QCustomPlot 等项目之前,情况似乎并非如此。直到它只是另一种实现方式,不多不少。
  • @Ariel M. Qt Widgets 没有被取代,也不能被取代,至少在一切都被重写之前,情况并非如此。
  • Qwt 和 QCustomPlot 是第三方项目,而不是 QtWidgets 的一部分,因此它们是否被移植是无关紧要的。此外,Anthony 是一个新手,他询问创建一个需要高度定制 UI 的 MIDI 控制器(请参阅 Arena、Lemur PS Elements 和类似软件)。 QML 是必经之路。
【解决方案3】:

作为专业开发 qt 应用程序的人,任何一天我都会选择 qml 而不是小部件。

小部件适用于非常基本的东西,但我一旦你需要创建一些更花哨的东西,小部件很快就会不足。

Qml 更加灵活,您可以将项目锚定在您想要的任何位置,而不是使用受限的小部件布局系统。几乎没有平台依赖性缺陷,而小部件充满了这些缺陷。属性绑定系统让您的 ui 与模型保持同步变得非常容易。

【讨论】:

  • 谢谢!根据您在回答中所述的专业背景,我刚刚决定从 QML/QtQuick 开始。只要意识到我可以轻松地使用来自 QtCreator 的 *.ui.qml 并直接在 PyQt 中使用它。解决了我对 Python + QtQuick 的初始设置!
  • 将 QtQuick 用于复杂的桌面程序在性能上是个坏主意...
  • 也许您对布局 API 的经验不够? QML 可以做什么,而 Widget 不能做什么?我在全球拥有 10Ks 用户的应用程序上与 Qt 合作超过 5 年,我们使用小部件,因为只有它们才能提供无限的功能。 QML 适用于原型和小型项目。是的,性能很重要。此外,由于 QML 是 OpenGL 驱动的,如果您的用户群充满了旧硬件,这将是一个障碍。
  • 或当前硬件的图形芯片组不支持 OpenGL,即大多数笔记本电脑的 GPU。
  • @AlanB 请问现在哪些笔记本电脑的 GPU 不支持 OpenGL?
【解决方案4】:

首先,我认为你应该从 Widget 开始。如果您以前的经验是关于前端的东西,那么小部件 UI 有助于轻松学习 qt。

【讨论】:

    【解决方案5】:

    Qt Quick 默认为 QML,启用内联 ECMAscript 的 JSON 声明方言。使用 Qt 小部件,设计人员可以制作样式表,开发人员可以进行原生 C++ 编码。

    QML 在运行时处理。在框架内,一切都可以一起运行,差异只会增加软件架构师决策的灵活性。

    【讨论】: