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: `MyWidget::MyWidget()'

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

    project.h

    class MyWidget :public QWidget
    {
      Q_OBJECT;
    public:
      MyWidget(void);
    public slots:
      void addint(void);
    private:
      QPushButton *add;
      QLineEdit* num1 ;
      QLineEdit* num2 ;
      QLineEdit* num3 ;
    }; 
    
    #endif
    

    project.cpp

    #include <QApplication>
    #include <QLineEdit>
    #include <QLabel>
    #include <QPushButton>
    #include <QLayout>
    #include <QString>
    #include "project.h"
    #include <QtGui>
    
    MyWidget::MyWidget(void)
    {
      num1 = new QLineEdit(this);  // Text-Feld
      num1->setText( "0" );
      num2 = new QLineEdit(this);  // Text-Feld
      num2->setText( "0" );
      num3 = new QLineEdit(this);  // Text-Feld
      num3->setText( "0" );
      QPushButton *qpb = new QPushButton("Add",this); // Knopf
      QLabel *qlab = new QLabel("Result",this); // label
      QVBoxLayout* layout = new QVBoxLayout(this);
      layout->addWidget(num1);
      layout->addWidget(qpb);
      layout->addWidget(num2);
      layout->addWidget(qlab);
      layout->addWidget(num3);
      // 
      QObject::connect(qpb,SIGNAL(clicked()),this,SLOT(addint())); // button => addint
      QObject::connect(num1,SIGNAL(returnPressed()),this,SLOT(addint())); // teield => addint
      QObject::connect(num2,SIGNAL(returnPressed()),this,SLOT(addint()));
    }
    void MyWidget::addint() { 
      int v1 = (num1->text()).toInt();
      int v2 = (num2->text()).toInt();
      int v3 = v1 + v2;
      QString qs;
      qs.setNum(v3);     
      num3->setText(qs);
    }
    

    main.cpp

    #include "project.h"
    int main(int argc,char** argv)
    {
      QApplication app(argc,argv);
      QWidget* mywidget = new MyWidget();
      mywidget->resize(120,130);
      mywidget->show();
      return app.exec();
    }
    

    Fehlermeldung

    In function `MyWidget::MyWidget()':
    project.cpp:(.text+0x2d): undefined reference to `vtable for MyWidget'
    project.cpp:(.text+0x34): undefined reference to `vtable for MyWidget'
    collect2: ld returned 1 exit status
    

    Vielen Dank schönmal im voraus.



  • mit welcher IDE/compiler erstellst du das programm?

    header der Klassen, welche das Q_OBJECT makro haben müssen von dem moc progrramm von Qt verarbeitet werden, damit z.b. die Slots in der klasse funktionieren



  • Programm habe ich mit qmake erstellt



  • Makefile habe einfach so erstell:

    qmake -project
    qmake-qt4 test.pro
    qmake-qt4
    make



  • Du musst in der *.pro Datei auch die Header mit angeben, damit qmake feststellen kann, ob ein header zusätzlich mit moc "bearbeitet" werden muss.

    HEADERS  += project.h
    

    oder verwende direkt den qt-creator der nimmt dir das verwalten der pro datei ab.


Log in to reply