由於要在控件中繪圖,用到自定義控件,在自定義控件中實現繪製圖形功能。
在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的機制還是有問題,出現此類找不到原因的問題,要解決掉還真花時間啊。