如何解决在 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 X
或 Clean all
,也可以在 Build
菜单中找到。
MOC易怒,需要做到以下几点:
- 将您的
QObject
派生的 class 移动到单独的源文件和头文件中(在您的情况下,创建 bot.h
和 bot.cpp
,并将 class 那里的代码)
- 单独声明和定义您的插槽代码(将
txt
定义为 bot.cpp
中的 bot::txt
)
MOC 生成相应的元class 文件(moc_bot.cpp
,在你的情况下),有时当有多个 QObject
派生的 class 时会感到困惑es 在一个文件中。最佳做法是为每个 QObject
派生的 class 使用一个头文件和一个源文件。
如果一切都失败了,您可能需要删除项目的 .pro.user
文件,然后退出并重新启动 Qt Creator。然后从 Build
菜单中选择 Clean all
、Run qmake
、Rebuild All
。
我有 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 X
或 Clean all
,也可以在 Build
菜单中找到。
MOC易怒,需要做到以下几点:
- 将您的
QObject
派生的 class 移动到单独的源文件和头文件中(在您的情况下,创建bot.h
和bot.cpp
,并将 class 那里的代码) - 单独声明和定义您的插槽代码(将
txt
定义为bot.cpp
中的bot::txt
)
MOC 生成相应的元class 文件(moc_bot.cpp
,在你的情况下),有时当有多个 QObject
派生的 class 时会感到困惑es 在一个文件中。最佳做法是为每个 QObject
派生的 class 使用一个头文件和一个源文件。
如果一切都失败了,您可能需要删除项目的 .pro.user
文件,然后退出并重新启动 Qt Creator。然后从 Build
菜单中选择 Clean all
、Run qmake
、Rebuild All
。