2009-09-02 120 views

回答

110

Qt documentation

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

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

14

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

+0

您在使用信号/插槽机制的类上只需要它也是错误的。缺少'Q_OBJECT'会中断'qobject_cast'和内省。它会导致一些令人困惑的行为,所以这是一个坏主意。 – 2016-04-07 20:39:27

+0

在任何其他(非'QObject')类中,'Q_OBJECT'都不会被“安静地”忽略。根据C++标准,它通过声明几个从未定义的成员函数和变量来引入未定义的行为。它还会用'QObject'特定的成员污染你的类的名字空间。例如。一个'Q_OBJECT'可能会破坏一个不相关的类,它恰好包含一个名为'metaObject'的方法。 – 2016-04-07 20:44:05

7

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

+0

这是错误的:'Q_OBJECT'宏由编译器扩展,moc不是必需的。 moc对宏本身并没有做任何事情,但是它产生了成员变量的**定义**和'Q_OBJECT'宏已声明**的方法。 – 2016-04-07 20:46:01

1

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

+0

这是误导性的:'Q_OBJECT'宏必须出现在每个派生自'QObject'的类中。当宏不存在时,你的代码会被细微的破坏,只是因为它正好编译并不能使它正常。 – 2016-04-07 20:47:23

+0

@KubaOber你有没有编译代码的例子,但是当'Q_OBJECT'宏丢失时不工作? – Chris 2017-11-06 17:50:07