qt moc笔记

 

STEP1
编译UI文件,生成[UI头文件]
命令行: "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_$(InputName).h" "$(InputPath)"输出
".\GeneratedFiles\ui_$(InputName).h"为了方便说明,将这里的“ui_$(InputName).h”简称为[UI头文件]。

输出的[UI头文件]定义了MOC的自定义生成步骤
命令行:
"$(QTDIR)\bin\moc.exe"  "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -DQT_CORE_LIB -DQT_GUI_LIB -DQT_LARGEFILE_SUPPORT -DQT_THREAD_SUPPORT -DUNICODE -DWIN32 -I"$(QTDIR)\include\." -I"$(QTDIR)\include\QtCore\." -I"$(QTDIR)\include\QtGui\." -I".\." -I".\GeneratedFiles\$(ConfigurationName)\." -I".\GeneratedFiles\."输出:
".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp"为了方便说明,将这里的“moc_$(InputName).h”简称为[MOC代码文件]。

STEP2
编译[UI实现文件],输出[MOC代码文件]。
[UI实现文件]一方面继承自QT的UI相关类,例如QWidget、QMainWindow,另一方面包含了[UI头文件],而这个头文件由于自定义了生成步骤,则会同时输出[MOC代码文件]。这个[MOC代码文件]和[UI实现文件],分别实现了UI类的2部分:QT的MOC机制和基本的C++类实现。这很巧妙,分2部分来定义一个标准的C++类,其中一部分是编译了另外一部分后生成的。
这个[MOC代码文件]很简单,就是Q_OBJECT宏定义的实现代码部分。这部分在官方帮助文档“Meta-Object System”中有详细说明。而MOC文件的工作方式在官方帮助文档“Using the Meta-Object Compiler (moc)”中有详细说明。

STEP3
编译[MOC代

 

Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。

moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。

在命令行下输入moc yourfilename.h -o moc_youfilename.cpp生成不带Q_OBJENT的源文件。

码文件],到此已编译完了UI类需要的所有定义代码。

 

qt中moc的作用 Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。

moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。

在命令行下输入moc yourfilename.h -o moc_youfilename.cpp生成不带Q_OBJENT的源文件。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 中,moc 文件的代码结构通常包括以下几个部分: 1. 头文件包含:moc 文件需要包含类的头文件,以便生成元对象代码和辅助代码。这部分代码通常类似于以下代码: ```c++ #include "myclass.h" #include <QtCore/qobject.h> #include <QtGui/qwindow.h> #include <QtWidgets/qpushbutton.h> ``` 2. 元对象代码:这部分代码定义了类的元对象,通常包括类名、基类名、属性、方法等信息。这部分代码通常类似于以下代码: ```c++ static const QMetaObject MyClass::staticMetaObject = { // ... }; const QMetaObject *MyClass::metaObject() const { // ... } void *MyClass::qt_metacast(const char *_clname) { // ... } ``` 3. 信号和槽函数实现:这部分代码实现了类中所有的信号和槽函数,通常包括函数名、参数类型和参数个数等信息。这部分代码通常类似于以下代码: ```c++ void MyClass::mySlot() { // ... } void MyClass::mySignal(int arg1, const QString &arg2) { // ... } ``` 4. 构造函数和析构函数实现:这部分代码实现了类的构造函数和析构函数,通常包括函数名、参数类型和参数个数等信息。这部分代码通常类似于以下代码: ```c++ MyClass::MyClass(QObject *parent) : QObject(parent) { // ... } MyClass::~MyClass() { // ... } ``` 5. 其他辅助代码:这部分代码通常包括 MOC_INCLUDES 宏定义和其他辅助宏定义等。这部分代码通常类似于以下代码: ```c++ #define MOC_INCLUDES(...) // ... Q_DECLARE_METATYPE(MyClass*) ``` 需要注意的是,moc 文件的代码结构是由 moc 工具自动生成的,通常无需手动修改。如果需要手动修改 moc 文件,应该先了解 Qt 元对象系统的相关知识,以免影响程序的正确性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值