Qt, QML, 小部件…有什么区别?

如果你是Qt的新手,可能会对你到目前为止所读到的所有概念感到有些困惑。本节旨在总结与开发Qt应用程序相关的所有关键组件。

请记住,Qt是作为C++框架设计和编写的,您会发现许多在基于C++的应用程序中有意义的引用、示例和概念,这些可能在您的Python应用程序中并不相关,但请记住,Qt for Python旨在通过许多适应将Qt框架暴露给Python。您不需要了解C++就可以使用Qt for Python,并且您可以在以后找到这些语言之间的所有可能组合。

Qt

Qt项目是一个开放协作项目,负责协调Qt框架的开发。在某些情况下,“Qt”可能指的是项目,也可能指的是框架。

作为一个框架,Qt有许多组件,这些组件按组件和模块分发,例如,qtbase是包含许多模块的基础组件,如:QtCoreQtGuiQtWidgetsQtNetwork等。所有这些模块包含许多你可以直接使用的类,例如QtCore的类,你可以从中找到像QFileQTimeQByteArray等类。

您可以在不使用用户界面的情况下创建应用程序,同时使用这些类来创建命令行应用程序、处理文件、网络连接、正则表达式、文本编码等。

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

还有许多其他的Qt模块,如QtMultimediaQtChartsQt3D等。这些模块具有特定的功能,在这些模块中,有一个叫做QtDeclarative的模块,你可以在其中找到QML声明式语言的实现。这种语言类似于CSS和JSON,它被创建用于声明式地设计UI应用程序,允许JavaScript处理一些命令式部分,并使其他组件能够扩展并将代码与C++连接。

让我们分别检查这些不同方法的功能。

小部件

正如我们之前提到的,QtWidgets 是提供预定义小部件的模块,您可以将这些小部件添加到图形应用程序中,例如按钮、标签、框、菜单等。

基于小部件的应用程序将看起来像原生应用程序,因为目标是不影响与其他包含的应用程序相比的用户体验。

../_images/hello_macOS.png ../_images/hello_win10.jpg ../_images/hello_linux.png

注意

你可以调整这些应用程序以使用你自制的样式,但 你需要意识到Widgets的目标是尊重系统 样式,更改颜色时要小心。查看这个 简单教程了解如何操作。

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小部件,您可以生成自己的Python绑定,以便人们可以直接从Python中使用它。

  3. 如果你有一个基于C++的库,用于你的Qt/C++应用程序中负责特定任务,比如一个高性能的进程,你可以为它生成绑定,这样人们就可以从Python中使用它。

  4. 对于一个Qt/C++应用程序,你可以通过将主QApplication单例作为Python绑定暴露给Python解释器来扩展它。这可以理解为你的Qt/C++应用程序的“Python插件系统”,例如。

对于步骤2., 3., 和 4.,你需要Shiboken的帮助,这是一个用于生成Qt for Python的绑定生成工具。你可以在文档页面找到更多信息。