如何解决在 QT 上的 C++ 中对 vtable 的未定义引用

How resolve undefined reference to vtable in c++ on QT

我有 Ubuntu 14.04 , C++ , QT , 我会 extend class QPushbutton ,我会制作一个新的 Slot 我愿意:

#include<QApplication>
#include<QDialog>
#include<QLabel>
#include <X11/Xlib.h>
#include<QVBoxLayout>
#include<iostream>
#include<QWidget>
#include<QPushButton>
#include <QThread>
#include <QGridLayout>
#include <QSplitter>
#include<QAbstractButton>
using namespace std;




class bot :  public QPushButton  {
   Q_OBJECT;

 public slots:
    void txt() {
        setText("hi");
         }


};


int main(int a , char * b[])
{
    QApplication application(a,b);
    QPushButton *button = new QPushButton();
    bot *l = new bot();
    button->setFixedSize(100,100);
    l->setText("sssssssssssssss");

    QVBoxLayout *ll  = new QVBoxLayout;
    ll->addWidget(l);
    ll->addWidget(button);
    QWidget x ;
    x.setLayout(ll);
    x.show();
    QObject::connect(button, SIGNAL(clicked()), l , SLOT( txt()) );

    return application.exec();


}

问题是:

/home/user/untitled6/sd.cpp:18: error: undefined reference to `vtable for bot'

如何解决问题???

我的 file.pro 是:

SOURCES += \
    sd.cpp
QT += widgets

FORMS += \
    form.ui

通常,运行ning QMake 可以解决此类错误。任何时候您创建一个从 QObject 派生的新 class,Qt 的模型元对象编译器 (MOC) 需要自动生成新 class 的元 class 的代码=] -- QMake 确保这种情况发生。

如果您使用的是 Qt Creator,只需从 Build 菜单中选择 select Run qmake

您可能还需要 运行 Clean project XClean all,也可以在 Build 菜单中找到。

MOC易怒,需要做到以下几点:

  • 将您的 QObject 派生的 class 移动到单独的源文件和头文件中(在您的情况下,创建 bot.hbot.cpp,并将 class 那里的代码)
  • 单独声明和定义您的插槽代码(将 txt 定义为 bot.cpp 中的 bot::txt

MOC 生成相应的元class 文件(moc_bot.cpp,在你的情况下),有时当有多个 QObject 派生的 class 时会感到困惑es 在一个文件中。最佳做法是为每个 QObject 派生的 class 使用一个头文件和一个源文件。

如果一切都失败了,您可能需要删除项目的 .pro.user 文件,然后退出并重新启动 Qt Creator。然后从 Build 菜单中选择 Clean allRun qmakeRebuild All