【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_2\main.cpp \
..\OsdGuiV_1_2\mainwindow.cpp \
..\OsdGuiV_1_2\mytabwidget.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_2\main.cpp \
..\OsdGuiV_1_2\mainwindow.cpp \
..\OsdGuiV_1_2\mytabwidget.cpp \
..\OsdGuiV_1_2\font_load.cpp debug\moc_mainwindow.cpp \
debug\moc_mytabwidget.cpp
由以上内容可以看到Makefile文件配置了moc_xxxxx.cpp文件,有了moc_xxxxx.cpp文件,那么这个类就可以正常使用信号与槽。