项目文件夹的组成(创建一个名为untitled4的Qt+opencv应用程序):
- untitled4.pro:
是构建工程项目时Qt处理的第一个文件,该文件称为QT项目文件,一个名为“qmake”的内部Qt程序负责处理该文件。
- untitled4.pro.user:
保存你的个人设置,不会影响项目的实质构建项目,仅包含用户个性化配置。
- main.cpp:应用程序的主程序在该文件中,由QtCreate自动生成,内容如下
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
- mainwindow.h:moc工具通过处理mainwindow.h 生成支持Qt特性的代码。
- mainwindow.cpp:
- mainwindow.ui:包含与组件显示方式相关的属性和一些其他的信息。
认识一下两个重要的Qt自己的工具:
- 元对象编译器moc(meta-object-complier)
它是 Qt框架中的一个预处理器工具,用于解析Qt的元对象系统相关的代码,并生成额外的C++代码,这些代码在编译时会被链接到应用程序中,从而启用Qt的关键特性。
MOC主要处理以下几种Qt的特性:
信号与槽机制(Signals and Slots):MOC分析标记为信号(signals)和槽(slots)的成员函数,并生成必要的代码来建立这些函数之间的连接。这样,当一个信号被发出时,相关的槽函数就能被自动调用,实现了对象间的通信。
属性系统(Property System):MOC也用于处理Qt的属性,即那些可以通过setProperty()和property()方法访问和修改的对象属性。MOC会生成代码来管理这些属性。
动态类型信息(Dynamic Type Information):MOC为类生成元数据,使得在运行时可以获取类的信息,如类名、父类、成员函数等,这对于实现诸如qobject_cast这样的运行时类型识别功能至关重要。
资源管理(Resource Management):虽然这不是MOC的主要职责,但它有时也会涉及到资源文件(.qrc)的处理,尤其是在使用Qt的资源系统时。
当使用Qt的类库编写应用程序时,任何包含Q_OBJECT宏的类都需要经过MOC的处理。Q_OBJECT宏不仅启用了上述特性,还告诉MOC哪些类需要处理。MOC会生成对应的.moc文件,这些文件包含了元对象系统所需的额外代码,随后这些文件会被常规的C++编译器编译并链接到最终的可执行文件中。
在Qt的构建过程中,MOC的调用通常是由qmake构建系统自动处理的,它会根据.pro项目文件中的规则调用MOC来处理相应的源文件。因此,对于开发者来说,通常不需要直接调用MOC,只需要关注编写符合Qt规范的代码即可。 - 用户界面编译器uic(user-interface-complier)
它 是Qt工具链中的一个关键组件。它的主要作用是将Qt Designer设计的用户界面文件(以.ui文件形式存在)转换成C++源代码,以便在应用程序中使用。这个过程允许开发者通过图形化界面设计工具Qt Designer创建和编辑界面布局,而无需手动编写大量的布局代码。
当你在Qt Designer中设计一个界面时,所有控件的位置、样式以及它们的属性都会被保存在一个.ui文件中。这个文件是XML格式的,包含了所有界面元素的描述。然而,.ui文件本身并不能直接在程序中使用,它需要被转换成C++代码,这就是UIC的作用。
UIC读取.ui文件,并生成对应的C++源文件和头文件。生成的代码通常包括一个继承自QWidget或其他基类的新类,该类包含了所有在.ui文件中定义的控件和布局。此外,UIC还会生成设置控件属性、连接信号与槽的代码,以及用于创建和初始化界面的构造函数。
生成的C++代码可以被编译并链接到你的应用程序中,这样你就可以在代码中实例化由UIC生成的类,从而加载你设计的用户界面。这种方式使得界面设计与逻辑代码分离,提高了开发效率和维护性。
在Qt的构建流程中,通常使用qmake来自动化这个过程。qmake会根据项目的.pro文件配置,自动调用UIC以及其他工具(如RCC和MOC)来处理.ui、.qrc和带有Q_OBJECT宏的源文件,确保在编译前所有的预处理工作都已完成。这样,开发者只需专注于业务逻辑和界面设计,而不用关心底层的代码生成细节。