moc(Meta-Object Compiler,元对象编辑器):
qt不是标准的c++语言,而是对其进行了一定程度的扩展,从qt新增加的关键字signals、slots等就可以看出来,因此在qt将源代码交给标准c++编译器之前,需要事先将这些扩展的语法去掉,完成这一工作的就是moc,因此qt的编译速度会比较慢。
moc在qt将源代码交由标准c++编译器之前,会先分析源文件,如果发现一个头文件中包含Q_OBJECT,就会生成一个"moc_"前缀的cpp文件,这个文件包含了Q_OBJECT的实现代码,同其他的源文件一同参与编译。(因此,包含Q_BJECT的类声明在cpp中,moc是不会处理的,这样做会出现链接错误)
注意:包含Q_OBJECT的头文件中,包含其他的类名称,要使用类的前置声明或者include(include最好在预编译头中),因为该头文件要生成moc_前缀cpp,需要认识里面的类名称。(见类的前置声明)