2012-03-29 48 views
3

我刚开始在Qt框架中编程。下面是一个非常简单的程序:C++/Qt Q_OBJECT宏导致错误

#include <QtCore/QCoreApplication> 
#include <QDebug> 

class MyClass : public QObject 
{ 
    Q_OBJECT 

public: 
    MyClass() {} 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    MyClass *c = new MyClass(); 
    return a.exec(); 
} 

但我收到以下错误,当我尝试编译&运行:
在功能MyClass
未定义参考vtable for MyClass
但是当我删除QObject宏一切工作正常。请注意,该类在与主函数相同的文件中定义。
我使用Qt版本4.7,在Win 7上运行。
是什么导致了这个问题?

更新:我在单独的头文件中定义我的类时遇到同样的错误。 mytimer.h:

#ifndef MYTIMER_H 
#define MYTIMER_H 
#include <QtCore> 

class MyTimer : public QObject 
{ 
    Q_OBJECT 

public: 
    QTimer *timer; 
    MyTimer(); 
public slots: 
    void DisplayMessage(); 
}; 


#endif // MYTIMER_H 

mytimer.cpp:

#include "mytimer.h" 
#include <QtCore> 

MyTimer::MyTimer() 
{ 
    timer = new QTimer(); 
    connect(timer,SIGNAL(timeout()),this,SLOT(DisplayMessage())); 

    timer->start(1000); 
} 

void MyTimer::DisplayMessage() 
{ 
    qDebug() << "timed out"; 
} 

这是main.cpp中:

#include <QtCore/QCoreApplication> 
#include <QDebug> 
#include "mytimer.h" 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    MyTimer *mt = new MyTimer(); 
    return a.exec(); 
} 
+0

显示您所使用的编译代码,请在命令(或多个)。 – timday 2012-03-29 16:41:53

+0

Qt2.7是相当古老的...你有没有尝试过一个更新的版本?我认为4.8是最新的。 – tmpearce 2012-03-29 16:42:57

+0

@tmpearce这是一个错误,它是4.7.4 – 2012-03-29 16:46:49

回答

3

你需要使用qmake的,这是要编译它为您的自定义QObject类创建模拟方法。有关生成moc文件的更多信息,请参阅here

由于您的示例不包含头文件,因此未对其进行分析,也没有生成moc文件。您需要在单独的头文件中声明MyClass,然后运行moc生成工具。

+0

我已更新我的问题。 – 2012-03-29 16:38:52

+1

虽然这可能会有所帮助,但您不需要**用qmake编译;无论您使用哪种编译/构建系统,您都必须正确配置。 – tmpearce 2012-03-29 16:55:10

1

当你使用QT Creator时,你应该清理你的项目并在build菜单中执行qmake。

1

每当ü应用一些改变先清理项目,然后QMAKE运行,最终建立自己的项目...