Seite 1 von 1

Q_OBJECT (signal & slots)

Verfasst: 13. Februar 2007 13:29
von mtrax
Hallo Qt-Programmierer!

Ich fange erst neu an mit Qt zu programmieren, ich habe folgenden Code und weiß nicht warum ich ihn nicht kompilieren kann:

Gui.h

Code: Alles auswählen

...
class Gui : public QMainWindow
{
    Q_OBJECT
    
public:
     Gui(QMainWindow *parent = 0);
     ~Gui();
     
public slots:
    void StartProcedure();
    void AbortProcedure();
    void QuitApplication();
};
...
Gui.cc

Code: Alles auswählen

#include "Gui.h"

Gui::Gui(QMainWindow *parent)
    :  QMainWindow (parent)
{
    //Groeße des Widgets, Breite x Hoehe
    setFixedSize(600, 340);
    setWindowTitle("MPF Station");
    
    //MENUBAR
    QMenuBar *mnbMain = new QMenuBar();
    mnbMain->setFixedSize(600, 32);
    //--FILE Menu
        QMenu *fileMenu = new QMenu(tr("Datei"));
        //--SETTINGS
            QAction *actSettings = new QAction(tr("Einstellungen"), this);
            fileMenu->addAction(actSettings);
        //--SEPARATOR
            fileMenu->addSeparator();
        //--CLOSE
            QAction *actClose = new QAction(tr("Beenden"), this);
            QObject::connect(actClose, SIGNAL(triggered()), this, SLOT(QuitApplication()));
            fileMenu->addAction(actClose);

...
}

void Gui::QuitApplication()
{
    //Programm wird beendet falls der Benutzer mit JA bestätigt.
    QMessageBox msgBox;
    msgBox.setText(tr("Wollen Sie das Programm wirklich beenden?"));

    QPushButton *yesButton = msgBox.addButton(tr("Ja"), QMessageBox::ActionRole);
    msgBox.addButton(tr("Nein"), QMessageBox::ActionRole);

    msgBox.exec();

    if (msgBox.clickedButton() == yesButton){
            qApp->quit();
    }
}
Fehlermeldung:
In function `ZN3GuiC2EP11QMainWindow':D:/Entwicklung/MPFStation_v2/Gui.cc:28: undefined reference to `vtable for Gui'
:D:/Entwicklung/MPFStation_v2/Gui.cc:28: undefined reference to `vtable for Gui'
build/Debug/GNU-Windows/Gui.o: In function `ZN3GuiC1EP11QMainWindow':D:/Entwicklung/MPFStation_v2/Gui.cc:28: undefined reference to `vtable for Gui'
:D:/Entwicklung/MPFStation_v2/Gui.cc:28: undefined reference to `vtable for Gui'
build/Debug/GNU-Windows/Gui.o: In function `ZN3GuiD2Ev':D:/Entwicklung/MPFStation_v2/Gui.cc:98: undefined reference to `vtable for Gui'
build/Debug/GNU-Windows/Gui.o:D:/Entwicklung/MPFStation_v2/Gui.cc:98: more undefined references to `vtable for Gui' follow
build/Debug/GNU-Windows/Gui.o: In function `ZThn8_N3GuiD0Ev':D:/Entwicklung/MPFStation_v2/Gui.cc:(.text$_ZN3Gui2trEPKcS1_[Gui::tr(char const*, char const*)]+0x1c): undefined reference to `Gui::staticMetaObject'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [dist/Debug/GNU-Windows/mpfstation_v2.exe] Error 1
mingw32-make[1]: Leaving directory `D:/Entwicklung/MPFStation_v2'
mingw32-make: *** [.build-impl] Error 2

Wenn ich Q_OBJECT auskommentiere dann funktioniert alles wunderbar bis auf den einen Slot eben -> eh' klar, ohne Q_OBJECT keine eigenen SLOTS.
Die Ergebnisse aus der Suche waren für mich leider nicht erfolgreich. Weiß jemand Rat?
Vielen Dank im vorraus!

lg Mario

Verfasst: 13. Februar 2007 13:56
von Christian81
[Standardantwort zum 65sten]
Benutzt QMAKE / CMake oder ein anderes ordentliches Tool zum Generieren eurer Makefiles! Oder lest euch durch was moc macht und baut es in euer manuell erstelltes Makefile ein.
[/Standardantwort zum 65sten]

Verfasst: 13. Februar 2007 13:59
von franzf
Das ist mir auch schon passiert, als ich mein makefile mit qmake erstellt hatte und nachträglich Q_OBJECT in den header gesetzt hatte. Selber Fehler.
Wenn dem so ist einfach nochmal qmake (qmake -project ist nicht nötig) ausführen, dann sollte es ohne Fehler kompilieren.

Grüße
Franz

Verfasst: 13. Februar 2007 14:04
von Christian81
franzf hat geschrieben:Das ist mir auch schon passiert, als ich mein makefile mit qmake erstellt hatte und nachträglich Q_OBJECT in den header gesetzt hatte. Selber Fehler.
Steht ja im Grunde auch hier: ttp://doc.trolltech.com/4.2/qmake-variable-reference.html#headers

"qmake will also automatically detect if moc is required ..."

Verfasst: 14. Februar 2007 08:24
von mtrax
Vielen Dank zunächst einmal für die rasche Hilfe!

Sorry, ich weiß das dieser Thread sehr oft vorkam, nur hatte ich genau das gleiche Problem wie das von franzf...

Was natürlich nicht schlecht wäre, ist wenn man dieses "Problem" unter den FAQs stellt.

lg Mario

Verfasst: 14. Februar 2007 08:39
von Christian81
Da viele einfach nicht wahrhaben wollen dass man qmake/cmake benötigt (und du es nicht geschrieben hattest) ging ich davon aus dass auch Du qmake nicht benutzt...
Ich habe mal versucht einen FAQ-Eintrag zu schreiben: http://www.qtforum.de/forum/viewtopic.php?p=18502#18502

Verfasst: 14. Februar 2007 09:48
von mtrax
Da viele einfach nicht wahrhaben wollen dass man qmake/cmake benötigt (und du es nicht geschrieben hattest) ging ich davon aus dass auch Du qmake nicht benutzt...
OK, ist mir leider nicht aufgefallen, war für mich selbstverständlich...qmake.

@FAQ Eintrag: Klasse!

Ich hoffe, dass diese Frage nicht zum 66sten Mal auftaucht ;-)