Q_OBJECT (signal & slots)

Alles rund um die Programmierung mit Qt
Antworten
mtrax
Beiträge: 6
Registriert: 15. Oktober 2006 12:17

Q_OBJECT (signal & slots)

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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]
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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 ..."
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mtrax
Beiträge: 6
Registriert: 15. Oktober 2006 12:17

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mtrax
Beiträge: 6
Registriert: 15. Oktober 2006 12:17

Beitrag 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 ;-)
Antworten