【QT】加入Q_OBJECT宏导致的error: undefined reference to `vtable for xxxxx'

原因:
当工程文件类中有加入Q_OBJECT宏,那么qt工程在编译的时候会生成一个moc_xxx.cpp的文件,该文件的作用是让你的QT工程能够正常使用信号与槽的机制。由于在加入Q_OBJECT宏之前,你已经编译过了工程,产生了编译文件夹(build-xxxx-Desktop_Qt_5_6_2_MinGW_32bit-Debug),此文件夹里的Makefile.Debug或者Makefile.Release文件也就已经产生。以下是加入Q_OBJECT宏之前的Makefile.Debug部分内容:
Makefile.Debug

SOURCES       = ..OsdGuiV_1_2main.cpp 
		..OsdGuiV_1_2mainwindow.cpp 
		..OsdGuiV_1_2mytabwidget.cpp 

由以上内容可以看到Makefile文件并没有配置moc_xxxxx.cpp文件输出。此Makefile文件在你不删除它情况下,整个qt工程编译的过程中只会生成一次该文件。也就是此时你在类中加入Q_OBJECT宏,编译文件夹的Makefile.Debug也不会改变,不会配置moc_xxx.cpp的文件。

解决方法:
将编译文件夹(build-xxxx-Desktop_Qt_5_6_2_MinGW_32bit-Debug)删除,再重新编译工程即可。以下是删除编译文件夹重新编译的Makefile.Debug部分内容:
Makefile.Debug

SOURCES       = ..OsdGuiV_1_2main.cpp 
		..OsdGuiV_1_2mainwindow.cpp 
		..OsdGuiV_1_2mytabwidget.cpp 
		..OsdGuiV_1_2font_load.cpp debugmoc_mainwindow.cpp 
		debugmoc_mytabwidget.cpp

由以上内容可以看到Makefile文件配置了moc_xxxxx.cpp文件,有了moc_xxxxx.cpp文件,那么这个类就可以正常使用信号与槽。

原文地址:https://www.cnblogs.com/lcgbk/p/13281138.html