2012-03-29 13 views
3

Ich habe gerade mit der Programmierung in Qt Framework begonnen. Im Anschluss ist ein sehr einfaches Programm:C++/Qt Q_OBJECT Makro verursacht einen Fehler

#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(); 
} 

Aber ich erhalte folgende Fehlermeldung, wenn ich versuche & laufen, es zu kompilieren:
undefined Verweis auf vtable for MyClass
Aber wenn ich die entfernen: MyClass
In Funktion QObject
Makro alles funktioniert gut. Bitte beachten Sie, dass die Klasse in derselben Datei definiert ist wie die Hauptfunktion.
Ich verwende Qt-Version 4.7, auf Win 7 laufen.
Was verursacht dieses Problem?

Update: Ich bekomme den gleichen Fehler, wenn ich meine Klasse in einer separaten Header-Datei definieren. 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"; 
} 

Und dies ist der 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

Zeigen Sie den Befehl (e) Sie bitte den Code zu kompilieren verwenden. – timday

+0

Qt2.7 ist ziemlich alt ... haben Sie eine neuere Version ausprobiert? 4.8 ist das neueste, denke ich. – tmpearce

+0

@tmpearce Es war ein Fehler, es ist 4.7.4 –

Antwort

3

Sie müssen es kompilieren mit qmake, was gehen Erstellen Sie Mock-Methoden für Ihre benutzerdefinierte QObject-Klasse. Siehe here über mehr beim Erzeugen von MOC-Dateien.

Da Ihr Beispiel keine Header-Dateien enthält, wird es nicht analysiert, und es werden keine MOC-Dateien generiert. Sie müssen MyClass in einer separaten Headerdatei deklarieren und das Moc-Generierungstool ausführen.

+0

Ich habe meine Frage aktualisiert. –

+1

Während dies hilfreich sein kann, brauchen Sie ** nicht ** mit qmake kompilieren; Sie müssen die Dinge jedoch richtig konfigurieren, egal welches Kompilier-/Build-System Sie verwenden. – tmpearce

1

Wenn Sie QT Creator verwenden, sollten Sie Ihr Projekt säubern und im Build-Menü qmake ausführen.

1

Jedes Mal, wenn u einige Änderungen zuerst reinigen Ihr Projekt anwenden, dann Qmake laufen, und die schließlich Ihr Projekt erstellen ...

Verwandte Themen