qtのundefined reference to vtable for出現原因

1482 ワード

今日、qtプログラムをテストするとき、図の便宜上、クラスの定義と実装を同じファイルに置いて、信号とスロットを使うので、クラスの定義にマクロQ_を加えました.OBJCETですが、コンパイル時にundefined reference to vtable for CMainWinが現れました.
テストコードは次のとおりです.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class CMainWin : public QMainWindow
{
    Q_OBJECT
public:
    CMainWin(QWidget *parent = NULL);
    ~CMainWin();

public slots:
    void on_act_open_triggered();
};


CMainWin::CMainWin(QWidget *parent)
    : QMainWindow(parent)
{
    QMenu *menu = menuBar()->addMenu("&File");
    QAction *act_new = new QAction("new", menu);
    QAction *act_open = new QAction("open", menu);
    menu->addAction(act_new);
    menu->addAction(act_open);

    act_open->setObjectName("act_open");
    QMetaObject::connectSlotsByName(this);
}

CMainWin::~CMainWin()
{

}

void CMainWin::on_act_open_triggered()
{

}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    CMainWin win;
    win.show();

    return app.exec();
}
後に資料を調べたところ、
qmakeは処理しません.cppファイルのQ_OBJECT、だから、もし.cppファイルにそれがあるとundefined reference to vtable for"xxx::xxx"も発生する.この場合、moc xxxxを先に使用する必要がある.cppは対応するmocファイルを生成し、さらに含む.cppの中に入ってこそ、この問題を解決することができる.
だから、これからは怠けないで、クラスの定義と実現を異なるファイルに置くことを忘れないでください.