如果你刚开始学习 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 的应用程序看起来更像原生应用程序,因为与其他方式开发的应用程序相比,它的目标是不影响用户体验。
你可以使用自制样式调整这些应用程序,但是 Widget 的目标是尊重系统样式,在更改颜色时要注意。
QML
与 Widgets 相比,QML 提供了创建用户界面的替代方法。它最初是为了移动应用程序开发而设计的。与 Qt Quick 模块一起使用,它可以实现点击、拖放、动画、状态、过渡、抽屉菜单等用户与移动设备之间的交互。
QML/Quick 应用程序中的元素侧重于提供一个更动态的应用程序底层结构,这个底层结构提供了基于某些行为的不同属性。
尽管 QML 是为了移动设备设计的,但你也可以使用它创建桌面应用程序。
此外,你可以使用标准 JavaScript 来增强应用程序,把它与 C++ 结合可以成为很不错的底层结构。
Python 和 C++
开发 Qt for Python 应用程序不需要了解 C++,但你可以在不同的使用情况下混合两种语言:
- 如果你有 Qt/C++应用程序,可以重新编写它,使它成为一个 Qt/Python 应用程序。这意味着 Python 的目标是完全在用户层面上取代 Qt 应用程序的 C++ 代码。
- 对于用 C++ 编写的自定义 Qt widgets,你可以用它生成自己的 Python bindings,以便其他用户可以直接在 Python 中调用它。
- 如果您有一个基于 C++ 的用于负责 Qt/C++ 应用程序特定任务的库,您同样可以为它生成Python bindings,以便用户可以在 Python 中调用它。
- 对于 Qt/C++ 应用程序,可以通过将整个主程序作为 python bingding 连接到 Python 解释器来扩展它。这可以理解为 Qt/C++ 应用程序的 “Python 插件系统” 。
对于步骤2、3、4 你需要 Shiboken 的帮助,Shiboken 是用于生成 Qt for Python 的 Python bingdings 生成工具。