Signals and Slots: Es wird nix kompiliert

Alles rund um die Programmierung mit Qt
Antworten
metalchuck
Beiträge: 3
Registriert: 9. Februar 2008 17:55

Signals and Slots: Es wird nix kompiliert

Beitrag von metalchuck »

Hallo!

Ich habe die Tage angefangen, mich etwas mit Qt zu beschäftigen, aber der Signals and Slots - Mechanismus treibt mich in den Wahnsinn, ich kriege einfach keine Programme mit selbsterstellten Signalen und Slots kompiliert. Ich habe den folgenden Code 1 zu 1 kopiert (!) von http://de.wikipedia.org/wiki/Signal-Slo ... _und_Slots:

Code: Alles auswählen

#include <QObject>

class Zahl : public QObject 
{
    Q_OBJECT

private:
    int wert;
   
public:
    Zahl() : wert(0)
    {
    }

    int wertLesen() const { return wert; }

public slots:
    void setzeWert(int wert)
    {
        if (wert != this->wert)
        {
            this->wert = wert;
            emit wertGeaendert(wert);
        }
    }
 
signals:
    void wertGeaendert(int neuerWert);
};

int main(void)
{
  Zahl a, b;           // a.wertLesen() == 0, b.wertLesen() == 0

  a.setzeWert(5);      // a.wertLesen() == 5, b.wertLesen() == 0
  b.setzeWert(48);     // a.wertLesen() == 5, b.wertLesen() == 48

  QObject::connect(&a, SIGNAL( wertGeaendert(int) ), &b, SLOT( setzeWert(int) ) );

  a.setzeWert(12);     // a.wertLesen() == 12, b.wertLesen() == 12
  b.setzeWert(23);     // a.wertLesen() == 12, b.wertLesen() == 23
}
aber er lässt sich einfach nicht kompilieren. Fehlermeldung:

Code: Alles auswählen

main.cpp:(.text+0x2a): undefined reference to `vtable for Zahl'
main.cpp:(.text+0x4b): undefined reference to `vtable for Zahl'
main.cpp:(.text+0x6f): undefined reference to `Zahl::wertGeaendert(int)'
main.cpp:(.text+0x8c): undefined reference to `Zahl::wertGeaendert(int)'
main.cpp:(.text+0xcd): undefined reference to `Zahl::wertGeaendert(int)'
main.cpp:(.text+0xea): undefined reference to `Zahl::wertGeaendert(int)'
main.cpp:(.text+0xf1): undefined reference to `vtable for Zahl'
main.cpp:(.text+0x100): undefined reference to `vtable for Zahl'
main.cpp:(.text+0x11f): undefined reference to `vtable for Zahl'
main.cpp:(.text+0x138): undefined reference to `vtable for Zahl'
collect2: ld returned 1 exit status
make: *** [test] Error 1
Was kann ich tun? Ich habe im Netz nichts gefunden, was mir helfen könnte. Die .pro - Datei sieht so aus:

Code: Alles auswählen

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += main.cpp
Ich hoffe, da weiß jemand was. Danke schonmal,
MetalChuck
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

metalchuck
Beiträge: 3
Registriert: 9. Februar 2008 17:55

Beitrag von metalchuck »

Das hat nichts gebracht, aber es scheint so, als ob das Problem daraus resultierte, dass die Klasse nicht in einer eigenen Header-Datei untergebracht war. Wenn ich Zahl in eine Datei Zahl.h auslagere, kompiliert das Programm. Ich werde da nochmal etwas mehr mit rumspielen.
metalchuck
Beiträge: 3
Registriert: 9. Februar 2008 17:55

Beitrag von metalchuck »

Hm, ich fürchte ich bin da einem grundsätzlichen Verständnisproblem bezüglich der signals aufgelaufen. Kann es sein, dass man eine als Signal deklarierte Methode niemals selbst ausprogrammiert, also mit Code füllt? Ist eine solche Methode also quasi ausschließlich dafür da, den Slot, mit dem sie verbunden wird, aufzurufen?

Wenn da jemand etwas Licht ins Dunkel bringen könnte wäre ich sehr dankbar!
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Ja, die werden nicht mit Code "befüllt". Und das mit dem Header Problem wird wohl an Qmake, dass das moc nur auf Header ausführt.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Definitionen von Klassen die Q_OBJECT enthalten sollten grundsätzlich *immer* in eine Header-Datei ausgelagert werden. Es geht auch innerhalb einer .cpp - Datei aber da muss man schon wissen was man macht bzw. es ist unüblich und daher für andere schwerer verständlich.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten