我刚开始使用Qt并注意到所有示例类定义都将宏Q_OBJECT
作为第一行。这个预处理器宏的目的是什么?
答案 0 :(得分:122)
元对象编译器,moc,是 处理Qt的C ++的程序 扩展。
moc工具读取C ++头文件。 如果找到一个或多个类 包含Q_OBJECT的声明 宏,它生成一个C ++源文件 包含元对象代码 那些课程。除其他事项外, 元对象代码是必需的 信号和插槽机制, 运行时类型信息,以及 动态财产制度。
答案 1 :(得分:15)
它只是告诉预编译器这个类有gui元素并且需要通过'moc'运行,你只需要将它添加到使用signal / slot机制的类中。
但它会在任何其他类中被悄悄地忽略 - 它只会增加构建时间。
答案 2 :(得分:7)
MOC(元对象编译器)将包含Q_OBJECT宏的头文件转换为C ++等效源代码。 它基本上控制了信号槽机制,使C ++编译器可以理解
答案 3 :(得分:2)
moc工具读取C ++源文件。如果它找到一个或多个包含Q_OBJECT宏的类声明,它会生成另一个C ++源文件,其中包含每个类的元对象代码。这个生成的源文件要么#include到类的源文件中,要么通常是编译并与类的实现链接。
2来自 THE Q_OBJECT
的Qt文档Q_OBJECT宏必须出现在类定义的私有部分中,该部分定义声明自己的信号和插槽,或者使用Qt的元对象系统提供的其他服务。
3来自 moc
的Qt文档moc工具读取C ++头文件。如果它找到一个或多个包含Q_OBJECT宏的类声明,它将生成一个C ++源文件,其中包含这些类的元对象代码。除此之外,信号和插槽机制,运行时类型信息和动态属性系统都需要元对象代码。
的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的元对象系统提供的其他服务。