Q_OBJECT宏有什么作用?为什么所有Qt对象都需要这个宏?

时间:2009-09-02 15:59:07

标签: c++ qt macros

我刚开始使用Qt并注意到所有示例类定义都将宏Q_OBJECT作为第一行。这个预处理器宏的目的是什么?

6 个答案:

答案 0 :(得分:122)

来自Qt documentation

  

元对象编译器,moc,是   处理Qt的C ++的程序   扩展。

     

moc工具读取C ++头文件。   如果找到一个或多个类   包含Q_OBJECT的声明   宏,它生成一个C ++源文件   包含元对象代码   那些课程。除其他事项外,   元对象代码是必需的   信号和插槽机制,   运行时类型信息,以及   动态财产制度。

答案 1 :(得分:15)

它只是告诉预编译器这个类有gui元素并且需要通过'moc'运行,你只需要将它添加到使用signal / slot机制的类中。
但它会在任何其他类中被悄悄地忽略 - 它只会增加构建时间。

答案 2 :(得分:7)

MOC(元对象编译器)将包含Q_OBJECT宏的头文件转换为C ++等效源代码。 它基本上控制了信号槽机制,使C ++编译器可以理解

答案 3 :(得分:2)

1来自 The Meta-Object System

的Qt文档

moc工具读取C ++源文件。如果它找到一个或多个包含Q_OBJECT宏的类声明,它会生成另一个C ++源文件,其中包含每个类的元对象代码。这个生成的源文件要么#include到类的源文件中,要么通常是编译并与类的实现链接。

2来自 THE Q_OBJECT

的Qt文档

Q_OBJECT宏必须出现在类定义的私有部分中,该部分定义声明自己的信号和插槽,或者使用Qt的元对象系统提供的其他服务。

3来自 moc

的Qt文档

moc工具读取C ++头文件。如果它找到一个或多个包含Q_OBJECT宏的类声明,它将生成一个C ++源文件,其中包含这些类的元对象代码。除此之外,信号和插槽机制,运行时类型信息和动态属性系统都需要元对象代码。

4来自 Signals and Slots

的Qt文档

Q_OBJECT宏由预处理器扩展,以声明由moc实现的几个成员函数;如果您在“对LcdNumber的vtable的未定义引用”中遇到编译器错误,您可能忘记运行moc或在链接命令中包含moc输出。

答案 4 :(得分:1)

在带有Q_OBJECT的gcc中,您可以看到扩展的宏。这就是# 11 "mainwindow.hh" #pragma GCC diagnostic push # 11 "mainwindow.hh" # 11 "mainwindow.hh" #pragma GCC diagnostic ignored "-Wsuggest-override" # 11 "mainwindow.hh" static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, cons t char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private: # 11 "mainwindow.hh" #pragma GCC diagnostic ignored "-Wattributes" # 11 "mainwindow.hh" __attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); # 11 "mainwindow.hh" #pragma GCC diagnostic pop # 11 "mainwindow.hh" struct QPrivateSignal {}; 在Linux上的gcc上扩展的内容。请注意,这可能取决于平台,并且可能会根据QT的版本进行更改。您可以看到它不仅是moc编译器的标签。

aws lambda update-function-code --function-name --zip-file

答案 5 :(得分:0)

Q_OBJECT宏必须出现在类定义的私有部分中,该部分定义声明自己的信号和插槽,或者使用Qt的元对象系统提供的其他服务。