由于要在控件中绘图,用到自定义控件,在自定义控件中实现绘制图形功能。
在wavewidget.h文件中定义类如下。
class WaveWidget:public QWidget
{
Q_OBJECT
public:
WaveWidget(QWidget *parent = 0);
WaveWidget(int width = 0,int height = 0,QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent * e);
};
一直编译不通过,提示“undefined reference to 'vtable for'”错误,查遍了书籍,没有发现语法错误,去掉“Q_OBJECT”就能编译通过。但是要用到消息和槽机制,不能屏蔽掉它。
通过查看错误信息,认为是.o文件问题,清除*.o文件,重新构建项目,删除debug文件夹等手段,依旧不能解决问题。纠结了很久。
最终查找资料发现,原因是moc没有更新导致,更新*.pro文件,重新qmake一下,顺利解决。
出现此问题的原因是:
预编译器打开宏Q_OBJECT,声明若干个由moc处理(implement)的成员函数。假如得到类似于“undefined reference to vtable for LcdNumber”的编译错误,可能是忘记了执行moc,或忘记了将moc输出加入到link命令里。qmake生成Makefile的时候,这个类的头文档中并没有Q_OBJECT,所以在相应的Makefile里面并没有用moc xxx.h命令,最终导致链接失败.
问题总结:
在QT中,遇到有些不可思议的问题,可以从qmake、*.pro、Makefile中入手,说不定就是这其中某个语句错误引起。
感谢博主的分享,网址如下。
<a target=_blank href="http://blog.chinaunix.net/uid-25749806-id-2942348.html">http://blog.chinaunix.net/uid-25749806-id-2942348.html</a>
感概:
QT的机制还是有问题,出现此类找不到原因的问题,要解决掉还真花时间啊。