如果你刚开始学习 Qt ,那么可能对于Qt, QML, Widgets 这几个概念有点困惑。本节旨在简单介绍与 Qt 开发相关的这几个关键组件。

需要注意,Qt 是用 C++ 语言设计和编写的一个 C++ 框架,所以你会发现关于 Qt 的很多有用的文章、例程和概念都是基于 C++ 的。这些内容可能跟Python不相关,但是需要了解的是,Qt for Python 旨在将 Qt 框架尽可能复现到 Python 上。所以你不需要学习 C++ 就可以使用 Qt for Python,同时你慢慢会发现将 C++ 和 Python 相结合的更多可能性。

Qt

Qt 项目是一个用来协调 Qt 框架开发的开放协作文件。你会发现 Qt 有时指的是项目,有时指的是框架。

作为一个框架,Qt 有许多组件。这些组件按组件模块分布。例如,qtbase 组件是包含许多模块(QtCore, QtGui, QtWidgets, QtNetwork 等)的基本组件。所有这些模块都包含许多可以直接使用的,比如你可以在 QtCore 模块里找到像 QFile, QTime, QByteArray 这些类。

通过这些类,你可以创建没有用户界面的应用程序,并创建命令行应用程序、处理文件、网络连接、正则表达式、文本编码等。

另一方面,你可以使用 QtWidgets 模块中的类创建图形应用程序,它也称为 Widgets。

还有许多其他 Qt 模块,像 QtMultimedia, QtCharts, Qt3D 等,这些模块都具有特定的功能。在这些模块中,有一个叫做 QtDeclarative 的模块,你可以在其中找到 QML 声明语言的实现。QML 语言类似于 CSS 和 JSON,它是为了能够声明性地设计 UI 应用程序而创造的。它同时还允许使用 JavaScript 处理某些命令部分,并允许使用其他组件将代码扩展和连接到C++。

让我们分别看看 Widgets 和 QML 的功能。

Widgets

像前面所说,QtWidgets 模块提供预定义的 Widgets(小部件),你可以将这些 Widgets 添加到图形应用程序中,如按钮、标签、框、菜单等。

基于 Widgets 的应用程序看起来更像原生应用程序,因为与其他方式开发的应用程序相比,它的目标是不影响用户体验。

qt调用pytorch和TensorFlow哪个方便 qt和python区别_Python

qt调用pytorch和TensorFlow哪个方便 qt和python区别_应用程序_02

你可以使用自制样式调整这些应用程序,但是 Widget 的目标是尊重系统样式,在更改颜色时要注意。

QML

与 Widgets 相比,QML 提供了创建用户界面的替代方法。它最初是为了移动应用程序开发而设计的。与 Qt Quick 模块一起使用,它可以实现点击、拖放、动画、状态、过渡、抽屉菜单等用户与移动设备之间的交互。

QML/Quick 应用程序中的元素侧重于提供一个更动态的应用程序底层结构,这个底层结构提供了基于某些行为的不同属性。

尽管 QML 是为了移动设备设计的,但你也可以使用它创建桌面应用程序。

此外,你可以使用标准 JavaScript 来增强应用程序,把它与 C++ 结合可以成为很不错的底层结构。

Python 和 C++

开发 Qt for Python 应用程序不需要了解 C++,但你可以在不同的使用情况下混合两种语言:

  1. 如果你有 Qt/C++应用程序,可以重新编写它,使它成为一个 Qt/Python 应用程序。这意味着 Python 的目标是完全在用户层面上取代 Qt 应用程序的 C++ 代码。
  2. 对于用 C++ 编写的自定义 Qt widgets,你可以用它生成自己的 Python bindings,以便其他用户可以直接在 Python 中调用它。
  3. 如果您有一个基于 C++ 的用于负责 Qt/C++ 应用程序特定任务的库,您同样可以为它生成Python bindings,以便用户可以在 Python 中调用它。
  4. 对于 Qt/C++ 应用程序,可以通过将整个主程序作为 python bingding 连接到 Python 解释器来扩展它。这可以理解为 Qt/C++ 应用程序的 “Python 插件系统” 。

对于步骤2、3、4 你需要 Shiboken 的帮助,Shiboken 是用于生成 Qt for Python 的 Python bingdings 生成工具。