Seite 1 von 1

Problem mit Q_OBJECT

Verfasst: 10. Februar 2008 15:09
von Bluffix
Hallo

Ich hab QT über die Installationsexe installiert (mit MinGW) und die Configure.exe ausgeführt. Dieser Teil sollte eigentlich problemlos verlaufen sein. Anschließend habe ich die Header in Dev C++ (meine Entwicklungsumgebung) eingebunden und die .lib/.a Dateien angegeben.
Dann habe ich mit "qmake -project" und "qmake" die .pro-Datei bzw. die makefiles erstellt und diese in Dev C++ eingebunden.

Wenn ich nun ein Programm ohne Q_OBJECT schreibe, wird dieses fehlerlos compiliert. Wenn ich allerdings Q_OBJECT setze, erscheint unter anderem folgende Fehlermeldung:

Code: Alles auswählen

[Linker error] undefined reference to `vtable for Hauptfenster'
Das ist mein Testprogramm:

Code: Alles auswählen

#include <QApplication>
#include <QObject>
#include <QWidget>
#include <QGridLayout>
#include <QLabel>
#include <QPushButton>


class Hauptfenster : public QWidget
{
  Q_OBJECT
  public:
  Hauptfenster ()
  {
     box = new QGridLayout (this);
     button[0] = new QPushButton ("Drücken1",this);
     button[1] = new QPushButton ("Drücken2",this);
     label[0] = new QLabel("Was ist das ?",this);
     label[1] = new QLabel("Was ist das ?",this);
     
     box->addWidget(button[0],0,0) ;
     box->addWidget(label[0],0,1) ;
     box->addWidget(button[1],1,0) ;
     box->addWidget(label[1],1,1) ;
     
     
     QObject::connect( button[0], SIGNAL(clicked()), this,
              SLOT(setlabel ()));
     QObject::connect( button[1], SIGNAL(clicked()), this,
              SLOT(setlabel())) ;
     this->show();
  }
  private slots:
     void setlabel ()
     {
        label[0]->setText("Label1");
        label[1]->setText("Label2");
     }    
  private:
  QGridLayout * box;
  QLabel * label[2];
  QPushButton * button[2];
};

Ich vermute, dass der MOC irgendwie nicht arbeitet, oder was meint ihr dazu ?

Wäre über Hilfe sehr dankbar.

Verfasst: 10. Februar 2008 15:37
von Christian81
Du vermutest richtig. Aber die Foren-Suche hätte Dir das auch gezeigt...
qmake kann nicht wissen wo irgendwas ist. Deshalb braucht es die Angabe der Header --> HEADERS += foo.h

Verfasst: 11. Februar 2008 14:22
von Bluffix
OK. Bei der Forensuche finde ich nicht genau die Antwort auf meine Frage.

Leider finde ich in keiner der Makefiles die Variable "HEADERS". Auch in der .pro Datei nicht.

Muss ich dort dann alle meine Projektdateien angeben oder wie ? ^^
Ich dachte nämlich mit "qmake -project" wird das automatisch eingetragen.
Müssen es dann absolute Pfade sein ?

In meinem QT-Buch wird nicht beschrieben, dass man die Headers selbst eingtragen muss und in einer anderen Anleitung auch nicht. Warum sagt jeder was anderes ? ^^

Verfasst: 11. Februar 2008 14:36
von franzf
Genau das Thema war eigentlich dieser Tage aktuell schon im Forum besprochen ;)
Du solltest nicht die Klasse im cpp deklarieren, da Moc nur Header verarbeitet. Drum findest du auch selbst nach einem qmake -project keine HEADERS-Variable in deiner .pro.
Also Klasse separat in einer Header-Datei (*.h :)) deklarieren, die Implementierung dann in deiner *.cpp. Aber nicht vergessen nochmal qmake -project + qmake auszuführen, sonst wird die Änderung nicht übernommen!

Grüße
Franz

Verfasst: 11. Februar 2008 14:41
von Bluffix
Ok, vielen Dank.

Hab zum testen einfach alles in eine .cpp geschrieben :D . Gut zu wissen, dass einem das in diesem Fall zum Verhängnis wird ^^.