1、这时候错误出现了,可是这个错误很多时候让人摸不着头脑,vtable是虚拟表的意思,类在创建实例的时候,Qt就是靠虚拟表去找类的相关定义的。所以这里出现这个问题,肯定是没有找到定义了。这里如果我去掉Q_OBJECT和所有的信号和槽,问题就能解决了。如下图,界面显示出来了,编译成功:
2、但是,我们本来想要的操作就没有了,qt里面不用信号和槽,那显然是不行的。所以,喉哆碓飙去掉信号和槽是行不通的。这里我们看到,信号和槽是由qt的moc程序去生成代洁船诼抨码的,moc程序将含有信号和槽的代码转换成C++代码,也就是说当你编译qt程序的时候,基本上用到信号和槽的类,都会在编译的时候由moc根据类的实现文件生成xxx.moc文件,然后编译器再根据这些moc文件生成moc_xxxx.cpp和moc_xxxx.o文件,这个时候才是真正的原始的C++的实现文件和链接文件。我们看qt案例addressbook的编译文件,这个大家可以在你qtcretor项目中的编译目录里看到,这个是正常情况下出现的moc文件。
3、然后我们就要考虑这里我们的项目出错在没有生成moc文件,所以我们需要让项目生成moc文件,经过查找qt帮助文档关于moc的说明,我们知道在类文件的末尾包含xxx.moc文件即可。
4、这里我们加上main.moc,但是依然不行,还是找不到main.moc文件,也就是说没有生成main.moc,然后我们查看这个项目的Makefile文件,就会发现main.cpp会直接生成m锾攒揉敫ain.o了,所以我们的moc文件就不会生成了,跳过了。所以要么你在project文件里添加关于moc文件的说明,要么修改Makefile文件,这两种方法我们在以后的文章里面说明,这里还有另一种方式,那就是修改我们的main文件的文件名。
5、譬如我直接改为sema.cpp,错误没有再出现,界面显示正常。这种方法才是改正vtable错误的正确方法,当然关于内部的原理及具体的分析我们在日后的文章中再说把。网上其他方式是碰巧给解决了,并非彻底的解决之道,所以这里记录下来供大家参考。最终结果如下图。