Seite 1 von 1

Signals and Slots: Es wird nix kompiliert

Verfasst: 9. Februar 2008 18:08
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

Verfasst: 9. Februar 2008 18:36
von franzf

Verfasst: 9. Februar 2008 19:04
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.

Verfasst: 9. Februar 2008 19:12
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!

Verfasst: 9. Februar 2008 19:26
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.

Verfasst: 10. Februar 2008 11:13
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.