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

Tre*_*ith 125 c++ macros qt

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

Stu*_*lar 129

Qt文档:

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

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

  • @mLstudent33如果需要,您可以编写 QObject::connect() 。 (2认同)

Mar*_*ett 17

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

  • 同样,如果您仅在使用信号/插槽机制的类上需要它,那也是错误的。没有Q_OBJECT会破坏qobject_cast和内省。这可能会导致一些令人困惑的行为,所以这是一个坏主意。 (3认同)
  • 并非所有其他(非QObject)类都会“悄悄地”忽略“ Q_OBJECT”。根据C ++标准,它通过声明一些从未定义的成员函数和变量来引入未定义的行为。它还会使用特定于QObject的成员污染类的名称空间。例如,Q_OBJECT可能会破坏一个不相关的类,该类恰好包含一个称为metaaObject的方法。 (2认同)
  • 错了 尽管您可能想为大多数gui类配备`Q_OBJECT`宏,但是让非gui类具有宏以及没有宏的gui类完全有意义。该宏很有用,但不仅限于gui类,也不是必需的。 (2认同)

小智 8

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

  • 那是错误的:`Q_OBJECT`宏是由编译器扩展的,不需要moc。Moc对宏本身不做任何事情,但是它会生成Q_OBJECT宏声明的成员变量和方法的定义。 (2认同)

小智 5

1 来自元对象系统的Qt 文档

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

2 来自Q_OBJECT 的Qt 文档

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

3 来自moc 的Qt 文档

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

4 来自信号和插槽的Qt 文档

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