前提
在一個已編譯的Qt項目中添加了一個類,該類未繼承QObject且未在頭文件添加Q_OBJECT,如下:
//MySignalSlot.h文件
#ifndef MYSIGNALSLOT_H
#define MYSIGNALSLOT_H
class MySignalSlot
{
public:
MySignalSlot();
};
#endif // MYSIGNALSLOT_H
若此時想使用Qt的信號槽通信機制,則需要添加QObject頭文件,繼承QObject,並在頭文件中添加Q_OBJECT;如下所示:
#ifndef MYSIGNALSLOT_H
#define MYSIGNALSLOT_H
#include <QObject>
class MySignalSlot : public QObject
{
Q_OBJECT
public:
MySignalSlot();
};
#endif // MYSIGNALSLOT_H
此時編譯程序,就會報錯:
undefined reference to `vtable for MySignalSlot'
解決方法
刪除該項目的build目錄,然後重新編譯即可;或者將新增的文件從項目中刪除(文件不刪除),然後再通過IDE“添加現有文件”添加文件,也可以解決。
原因
當通過Qt這個IDE創建新類中添加QObject頭文件和Q_OBJECT後,Qt會生成相應的“moc_XXX.cpp”文件,用於信號槽的通信實現。但是若在創建類時沒有通過Qt添加QObject頭文件和Q_OBJECT,Qt無法生成相應的“moc_XXX.cpp”文件,此時就會報錯:undefined reference to `vtable for XXX',如上面例子。
結尾
只爲記錄,只爲分享! 願所寫能對你有所幫助。不忘記點個贊,謝謝~