我在控制台应用程序中创建了用于处理QTimer的最简单的类。
编译器生成错误:未定义对“ vtable for Timer”的引用。 Whereind使用构造函数引用字符串:Timer(){}
我在此站点上找到了许多有关此问题的建议,例如:
Undefined reference to vtable. Trying to compile a Qt project
Qt Linker Error: "undefined reference to vtable"
Q_OBJECT throwing 'undefined reference to vtable' error
所有答案归结为清除项目,然后运行QMake并重建项目。 不幸的是,所有这些都没有帮助我。 我还尝试删除“ Debug”文件夹,并在执行上述操作后-结果相同。
我在真正的多文件程序中不断地积极使用信号和插槽技术,但从未遇到过此类问题。
请分享您的想法!
#include <QCoreApplication>
#include <QDebug>
#include <QTimer>
#include <QObject>
class Timer : public QObject {
Q_OBJECT
public:
Timer() {}
virtual ~Timer() {}
public slots:
void someSlot();
};
void Timer::someSlot() {
qDebug() << "someSlot()";
}
int main(int argc, char *argv[])
{
QCoreApplication aa(argc, argv);
QTimer *timer = new QTimer();
Timer *myTimer = new Timer();
QObject::connect(timer, SIGNAL(timeout()), myTimer, SLOT(someSlot()));
timer->start(1500);
return aa.exec();
}
//-----------------------
// pro-file
QT += core
QT -= gui
CONFIG += c++11 c++14
TARGET = test_for_all
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
答案 0 :(得分:2)
由于您的Timer
仅具有定义形式(标头中没有声明),Qt moc tool无法检测到Q_OBJECT
宏并无法生成所需的时隙,信号和元数据信息。< / p>
要解决此问题,您可以执行以下一项操作:
Timer
声明创建标头HEADERS += main.cpp
答案 1 :(得分:2)
由于它是从*.pro
继承的,因此您必须为您的类创建头文件并将其正确添加到QObject
文件中。