我刚开始使用Qt,并注意到所有示例类定义都以宏Q_OBJECT
作为第一行。这个预处理器宏的目的是什么?Q_OBJECT宏是做什么的?为什么所有的Qt对象都需要这个宏?
回答
元对象编译器,MOC,是 程序来处理Qt的C++ 扩展。
moc工具读取C++头文件。 如果它发现一个或多个包含Q_OBJECT 宏的类 声明,它会生成包含这些类的元对象代码 的C++源文件 。其中, 元对象代码是 信号和插槽机制, 运行时类型信息和 动态属性系统所必需的。
它只是告诉预编译器这个类有gui元素,需要通过'moc'运行,你只需要将它添加到使用信号/槽机制的类。
但它会在其他任何类中被安静地忽略 - 它只会增加构建时间。
您在使用信号/插槽机制的类上只需要它也是错误的。缺少'Q_OBJECT'会中断'qobject_cast'和内省。它会导致一些令人困惑的行为,所以这是一个坏主意。 – 2016-04-07 20:39:27
在任何其他(非'QObject')类中,'Q_OBJECT'都不会被“安静地”忽略。根据C++标准,它通过声明几个从未定义的成员函数和变量来引入未定义的行为。它还会用'QObject'特定的成员污染你的类的名字空间。例如。一个'Q_OBJECT'可能会破坏一个不相关的类,它恰好包含一个名为'metaObject'的方法。 – 2016-04-07 20:44:05
MOC(元对象编译器)将Q_OBJECT宏包含的头文件转换为C++等效源代码。 它基本上控制信号槽机构,并使其可以理解到C++编译器
这是错误的:'Q_OBJECT'宏由编译器扩展,moc不是必需的。 moc对宏本身并没有做任何事情,但是它产生了成员变量的**定义**和'Q_OBJECT'宏已声明**的方法。 – 2016-04-07 20:46:01
的Q_OBJECT宏必须出现在类定义,声明它自己的信号和槽或私人单元,使用由Qt的提供的其他服务元对象系统。
这是误导性的:'Q_OBJECT'宏必须出现在每个派生自'QObject'的类中。当宏不存在时,你的代码会被细微的破坏,只是因为它正好编译并不能使它正常。 – 2016-04-07 20:47:23
@KubaOber你有没有编译代码的例子,但是当'Q_OBJECT'宏丢失时不工作? – Chris 2017-11-06 17:50:07
- 1. 为什么Q_OBJECT宏导致问题(Qt)?
- 2. 这个C++宏是做什么的?
- 3. 这些宏做什么(LLVM)?
- 4. 这个rsAssert宏的含义是什么?
- 5. 什么是宏?
- 6. 这个Julia宏为什么不需要`esc`?
- 7. 为什么在这个宏定义中需要@符号?
- 8. 这个C宏是什么意思?
- 9. 这个宏是做什么的? __success(返回> = 0)长
- 10. ReactiveCocoa:rac_keywordify宏。为什么rac_keywordify实际上需要什么?
- 11. 这个宏有什么问题?
- 12. 这个run_on_main()宏有什么问题吗?
- 13. 这个宏有什么问题?
- 14. 这2个宏有什么区别?
- 15. 宏在MASM32中做什么?
- 16. %(AdditionalDependencies)宏是什么?
- 17. 宏的目的是什么?
- 18. 为什么所有这些都需要JSON?
- 19. 什么是Rails中的宏?
- 20. 为什么不能用Q_OBJECT宏编译(链接)?
- 21. 为什么UIInterfaceOrientationIsLandscape是一个宏?
- 22. 为什么stdarg.h有一个宏«__va_size»?
- 23. 什么时候宏不是宏? (MS Word)
- 24. 什么是计算宏和语法宏
- 25. 这些宏参数有什么问题?
- 26. 为什么需要两个括号在c/C++中使用宏?
- 27. 这个宏定义了什么?
- 28. 为什么#定义一个空的宏?
- 29. 什么是这个对象?
- 30. 为什么我需要宏的双层间接寻址?
QT是指QuickTime,Qt是指称为Qt的C++库。 – Bleadof 2009-09-03 19:43:16