当在编程QT应用程序在类的定义中包含Q_OBJECT宏,编译时qmake生成的makefile将会自动包含一些运行moc的规则,moc就是指QT的元对象编译器,即meta_object complier。
为了使moc能够正常运行,必须把类定义从实现文件中分离出来并放到头文件中。由moc生成的代码会包含这个头文件,并且会添加一些特殊的C++代码。
必须对使用了Q_OBJECT宏的类运行moc。因为qmake会自动在makefile中添加这些必要的规则,所以开发人员不必在编译时使用moc。但是如果忘记了使用qmake重新生成makefile,并且也没有重新运行moc,那么连接程序就会报错,指出你声明了一些函数但是却没有实现它们。在linux平台下,这些信息可能是'undefined reference to 'XXX::staticMetaObject'(XXX是类名)。
所以遇到这种情况时,可重新运行qmake生成新的makefile文件,然后在重新构建该应用程序。
(注:当程序中需要使用Q_OBJECT宏时,应将它放入头文件中。)