[QT] SLOT in selbstgeschreibener Klasse nicht akzeptiert?



  • Hallo Leute!
    Ich habe eine Klasse geschrieben (TDMainWidget), die von einem Widget erbt. Zu dieser Klasse habe ich einen SLOT hinzugefügt:

    public slots:
    	void newDataSet();
    

    Im Konstruktor verbinde ich das Signal clicked() eines Buttons mit dem SLOT newDataSet:

    connect(this->buttonNew, SIGNAL(clicked()), this, SLOT(newDataSet()));
    

    Eigentlich sollte das ganze funktionieren, aber QT meldet folgendes:
    QObject::connect: No such slot MainWidget::newDataSet()

    Besonders komisch finde ich, dass QT die Klasse als MainWidget identifiziert, die ja aber eigentlich nur die Klasse ist, von der geerbt wird.
    Was mache ich falsch?



  • Hat deine Klasse auch QOBJECT in der definition drin stehen?



  • Nein, hatte es nicht. Wenn ich es allerdings hinzufüge werde ich mit einer Flut von Fehlern bombadiert:

    tdmainwidget.o(.text+0x1c): In function TDMainWidget::TDMainWidget[not-in-charge](QObject*, char const*)': /usr/lib/qt3/include/qglist.h:153: undefined reference tovtable for TDMainWidget'
    tdmainwidget.o(.text+0x28):/usr/lib/qt3/include/qglist.h:153: undefined reference to vtable for TDMainWidget' tdmainwidget.o(.text+0x68): In functionTDMainWidget::TDMainWidget[in-charge](QObject*, char const*)':
    /home/hackbert/projekte/kteledata/kteledata/tdmainwidget.cpp:7: undefined reference to vtable for TDMainWidget' tdmainwidget.o(.text+0x74):/home/hackbert/projekte/kteledata/kteledata/tdmainwidget.cpp:7: undefined reference tovtable for TDMainWidget'
    tdmainwidget.o(.text+0xa3): In function TDMainWidget::~TDMainWidget [not-in-charge]()': /home/hackbert/projekte/kteledata/kteledata/tdmainwidget.cpp:12: undefined reference tovtable for TDMainWidget'
    tdmainwidget.o(.text+0xaf):/home/hackbert/projekte/kteledata/kteledata/tdmainwidget.cpp:12: more undefined references to `vtable for TDMainWidget' follow

    Was bringt das Q_OBJECT eigentlich? Und was bedeuten die Fehlermeldungen?



  • Die Zeile

    public slots:
    

    ist eigentlich kein C++.

    Bei Qt gibt es einen MOC Preprozessor. Er nimmt alle Wörter, die nicht in dem ANSI C++ Umfang enthalten sind (z. B. QOBJECT, slots, signals) aus dem Programm raus und fügt stattdessen Initialisierungscode ein. (Eine *.moc Datei)
    Wenn du KDevelop benutzst musst du in der Projektansicht auf Dateien klicken und dann rechtsklicken auf dein src-Ordner "Makefile.am" aktualisieren und "Erstellen" im Menü auswählen, anschließend "Aufräumen" und "Alles neu erstellen", dann kriegst du keine Fehlermeldungen mehr.



  • Klasse! Vielen Dank! Hat wunderbar funktioniert...

    FAQ???



  • wieso, steht doch in der doku drin.


Anmelden zum Antworten