Signal Slot Problem (No such slot...)

Alles rund um die Programmierung mit Qt
Antworten
apollox
Beiträge: 3
Registriert: 3. Juli 2011 21:34

Signal Slot Problem (No such slot...)

Beitrag von apollox »

Hallo Leute,

ich habe vor einiger Zeit angefangen mich mit QT zu beschäftigen und habe bei meinem aktuellen Projekt ein Problem mit dem Signal Slot Konzept für eigene Slots.
Bisher habe ich eher selten eigene Slots benötigt und Sie wenn in der MainWindow Klasse belassen, aktuell benötigt ich jedoch einen eigenen Slot der in eine andere Klasse gehört und auch einen Paramter übergeben bekommt. Die Parameterübergabe habe ich gelöst über die Klasse SignalMapper.

Mein Problem besteht darin, das der Connect Befehl meckert beim Programmstart, das der Slot nicht existiert, weil ich was falsch bei der Membervariable gemacht habe von der Klasse wo der Slot drin ist, vermutlich bei der Verervung. Ich muss dazu sagen, das ich mit dem Thema Vererbung in C++ noch nicht so viel Erfahrung habe und da eher noch ein Laie bin.

Die Meldung bei Programmstart lautet:
Object::connect: No such slot QObject::auswahl(QString) in ...
Bezieht sich auf die letzte Zeile im Konstruktor der mainwindow.cpp

Der Konstruktor der mainwindow.cpp

Code: Alles auswählen

Uebung_Auswahl *uebung = new Uebung_Auswahl();

QSignalMapper* signalMapper = new QSignalMapper (this);
	connect( ui->actionDas_1x1, SIGNAL(triggered()), signalMapper, SLOT(map()) );
	connect( ui->actionTextaufgaben, SIGNAL(triggered()), signalMapper, SLOT(map()) );

	signalMapper->setMapping(ui->actionDas_1x1, "1mal1");
	signalMapper->setMapping(ui->actionTextaufgaben, "Textaufg");

	connect( signalMapper, SIGNAL(mapped(QString)), uebung, SLOT(auswahl(QString)) );
Die uebung_auswahl.h

Code: Alles auswählen

#include "QString"
#include "QObject"

class Uebung_Auswahl : public QObject
{
public:
	Uebung_Auswahl();

public slots:
	void auswahl(QString ueb_name);
};
Und die uebung_auswahl.cpp

Code: Alles auswählen

#include "QDebug"

Uebung_Auswahl::Uebung_Auswahl()
{
}

void Uebung_Auswahl::auswahl(QString ueb_name)
{
	qDebug() << "Aufruf von Funktion 'Uebung_Auswahl::auswahl'!";
}
Ich hoffe das Ihr mir bei diesem vermutlich ganz dummen Fehler helfen könnt, das der Slot doch noch funktioniert;)

Vielen Dank!

Schöne Grüße
apollox
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Q_OBJECT im Header vergessen. Siehe http://doc.trolltech.com/4.7/signalsand ... ll-example
Btw: Die include-Statements sind falsch --> '#include <QObject>' usw. ist richtiger
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
apollox
Beiträge: 3
Registriert: 3. Juli 2011 21:34

Beitrag von apollox »

Erstmal Danke für deine Antwort ;)
Habe jetzt das Q_OBJECT Makro hinzugefügt und die #includes mit <> gemacht, jedoch gibt es nun beim kompilieren direkt einen Fehler mit dem ich nicht wirklich was anfangen kann.

Fehler:
uebung_auswahl.cpp:5: Fehler: undefined reference to `vtable for Uebung_Auswahl'
Fehler: collect2: ld returned 1 exit status
uebung_auswahl.h

Code: Alles auswählen

#include <QObject>
#include <QString>

class Uebung_Auswahl : public QObject
{
	Q_OBJECT

public:
	Uebung_Auswahl();

public slots:
	void auswahl(QString ueb_name);
};
uebung_auswahl.cpp

Code: Alles auswählen

#include "uebung_auswahl.h"

#include <QDebug>

Uebung_Auswahl::Uebung_Auswahl()
{
	qDebug() << "Aufruf vom Konstruktor 'Uebung_Auswahl'"; 
}

void Uebung_Auswahl::auswahl(QString ueb_name)
{
	qDebug() << "Aufruf von Funktion 'Uebung_Auswahl::auswahl'!";
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Welches Buildsystem? Schonmal die Foren-Suche mit 'vtable' gefüttert? Kommt alle paar Tage ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
apollox
Beiträge: 3
Registriert: 3. Juli 2011 21:34

Beitrag von apollox »

Danke für den Hinweis, auf die Idee mit der SuFu hätte ich auch selbst kommen können.
Denn da fand ich den entscheidenen Tipp mit "Alles neu erstellen" und jetzt funktioniert das auch.
Antworten