Q_OBJECT verursacht "undefined reference to vtable"



  • Hallo Zusammen. Ich bin noch relativ neu mit QT.
    Mein Progamm funktioniert soweit ganz gut, doch ich bekomme mein Slot nicht ans Laufen.
    Wenn ich Q_OBJECT auskommentiere, läuft das Programm zwar, aber der Slot funktioniert nicht. Andernfalls kommt die Fehlermeldung: "undefined reference to vtable: MinenFeld::MinenFeld(QWidget *parent)
    : QWidget(parent)"

    Hier ist mein Code. Vielleicht kennt jemand die Lösung.
    Vielen Dank.

    #include <QApplication>
    #include <QFont>
    #include <QGridLayout>
    #include <QLCDNumber>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QWidget>
    
     class MinenFeld : public QWidget
     {
     Q_OBJECT
    
     public:
         MinenFeld(QWidget *parent = 0);
    
      public slots:
       void getInfo(void) { qDebug("Executing slot"); } 
    
     signals:
     };
    
     MinenFeld::MinenFeld(QWidget *parent)
         : QWidget(parent)
     {
         QPushButton *feld = new QPushButton("");
         //feld->setFont(QFont("Times", 6, QFont::Bold));
         feld->setFixedSize(20, 20);
    
         connect(feld, SIGNAL(clicked()), qApp, SLOT(getInfo()));
    
         QVBoxLayout *layout = new QVBoxLayout;
         layout->addWidget(feld);
         layout->setMargin(0);
         setLayout(layout);
    
     }
    
    class MyWidget : public QWidget
     {
    
     public:
         MyWidget(QWidget *parent = 0);
    
     };
    
     MyWidget::MyWidget(QWidget *parent)
         : QWidget(parent)
     {
         QPushButton *quit = new QPushButton(tr("Quit"));
        quit->setFont(QFont("Times", 10, QFont::Bold));
         connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
    
         QGridLayout *grid = new QGridLayout;
         grid->setSpacing(1);
    
         for (int row = 0; row < 16; ++row) {
             for (int column = 0; column < 30; ++column) {
                 MinenFeld *minenfeld = new MinenFeld;
                 grid->addWidget(minenfeld, row, column);
    
             }
         }
    
         QVBoxLayout *layout = new QVBoxLayout;
         layout->addWidget(quit);
         layout->addLayout(grid);
         setLayout(layout);
     }
    
     int main(int argc, char *argv[])
     {
         QApplication app(argc, argv);
         MyWidget widget;
         widget.show();
         return app.exec();
     }
    


  • nachdem du das Makro eingefügt hast, musst du qmake erneut ausführen, da er einige zusätzliche Befehle ins Makefile eintragen muss



  • Hallo. Ich habe nun mit qmake die Projektdatei neu erstellt. Leider besteht mein Problem weiterhin.
    Ich arbeite übrgens mit dem Programm QDevelop.

    Hier ein Auszug:

    Erstellen (make)...
    g++ -Wl,--no-undefined -o nMines nMines.o -L/usr/lib -lQtGui -lQtCore -lpthread
    nMines.o: In function MinenFeld': /...pfad.../src/nMines.cpp:28: undefined reference tovtable for MinenFeld'



  • ist das Q_OBJECT-Makro in allen Klassen, in denen du signals/slots verwendest?
    Nach deinem Quelltext fehlt es in der Klasse MyWidget



  • Hallo. Wenn ich Q_QBJECT auch in die Klasse MyWidget einfüge, bekomme ich auch für diese Klasse die Fehlermeldung:

    undefined reference to vtable for MinenFeld' undefined reference tovtable for MyWidget'



  • Ich bin der Meinung, daß ich das Problem mit der undefinierten Referenz auf vtable schon einmal gehabt hatte. Wenn ich mich richtig erinnere mußte die vorhandene .pro-Datei gelöscht, umbenannt oder sonstwie entfernt werden und dann anschließend die .pro-Datei mit qmake neu erstellt werden. Danach war dieser Fehler weg. Am besten dürfte es sein, qmake aus der Konsole direkt aufzurufen und nicht über KDevelop.



  • ich hab das dumpfe Gefuehl, dass du alles in einer Datei hast...

    zumindest die main.cpp sollte alleine sein und auch bei den anderen beiden empfiehlt sich eine Trennung...

    wenn ich deinen Code entsprechend in 5 Dateien aufgeteilt kompiliere, gibt es keinerlei Probleme



  • Vielen Dank. Es lag genau daran, dass der ganze Code in einer Datei stand.
    Ich hatte mich an ein Tutorial gehalten, dass die Klassen nicht in header-Dateien auslagert. 😞

    Nachdem ich das Programm in 5 Dateien aufgeteilt habe, funktiert es nun auch.
    Ich musste lediglich noch "qApp" gegen "this" ändern, damit der Slot auch funktioniert.

    Danke für die Unterstützung.



  • eine weitere Lösung ist die Verwendung von "moc"

    eigentlich kannst du alles in einer Datei lassen. Du musst dafür sorgen (entweder via Makefile oder auf der Kommandozeile) dass moc auf deine cpp angewendet wird.
    moc foo.cpp -o foo.moc

    dieses .moc file bindest du ein, am ende deiner .cpp Datei:
    #include "foo.moc"

    http://doc.trolltech.com/4.4/moc.html#moc


Anmelden zum Antworten