正确的使用方式和原因
- 头文件中定义:正确的做法是在头文件(
.h
)中定义包含Q_OBJECT
宏的类。例如:
#ifndef PERSON_H
#define PERSON_H
#include <QObject>
class Person : public QObject {
Q_OBJECT
public:
Person(QObject* parent = nullptr);
};
#endif
- 这样,在编译过程中,moc可以扫描头文件并找到这个类定义。当处理
Q_OBJECT
宏时,moc会生成一些额外的C++代码,这些代码通常会包含在一个与头文件对应的moc_*.cpp
文件中(*
代表文件名的其他部分)。这些生成的代码实现了信号 - 槽机制的连接、属性系统的支持等元对象相关的功能。 - 编译流程考虑:在整个编译流程中,头文件用于提供类的定义和接口信息,多个
.cpp
文件可以包含这个头文件来使用这个类。moc在这个过程中扮演了一个重要的角色,它确保了带有Q_OBJECT
宏的类能够正确地融入Qt的元对象系统。如果在.cpp
文件中随意定义带有Q_OBJECT
宏的类,会破坏这个正常的编译流程和元对象系统的工作机制。