SLOT wird nicht gefunden

Alles rund um die Programmierung mit Qt
Antworten
Nailgun
Beiträge: 22
Registriert: 3. März 2009 11:59

SLOT wird nicht gefunden

Beitrag von Nailgun »

Hey Leute
ich beschäftige mich seit ca einer Woche mit QT und bin gerade dabei mit den Network Beispielen eine bisschen zu experimentieren. Dabei bin ich jetzt auf ein Problem mit SIGNAL und SLOT gestoßen.

Im Endeffekt ist es so, dass ich eine Klasse ChatServer habe die vom QTcpServer erbt. Diese Klasse erstellt bei einer neuen Verbindung(also wenn incomingConnection(socketId) ausgelst wird) einen Pointer auf ein Objekt der Klasse ClientSocket die vom QTcpSocket erbt. Nun möchte ich das Signal messageReceived(QString) vom ClientSocket mit dem Slot messageFromClient(QString) com ChatServer verbinden.

Aber beim Debuggen kommt immer in der Connect Zeile folgende Ausgabe:
"Object::connect: No such slot QTcpServer::messageFromClient(QString)"
und folglich wird die Verbindung auch nicht erstellt. Die incommingConnection Methode is ja eine Methode des QTcpServers, deswegen wird sich der this Pointer in der connect Zeile auf den QTcpServer beziehen, da ja seine Methode aufgerufen wurde.

Aber wie kann ich das ändern?
Ich hoff mal das ich hier ned zu blöd frag.

Hier noch der Source der ChatServer.h:

Code: Alles auswählen

#ifndef CHATSERVER_H
#define CHATSERVER_H

#include <QTcpServer>
#include <QString>

class ChatServer: public QTcpServer
{
public:
	ChatServer(QObject *parent = 0);
	virtual ~ChatServer();

protected slots:
	void messageFromClient(QString message);

private:
    void incomingConnection(int socketId);

};
#endif
und der Source der ChatServer.cpp

Code: Alles auswählen

#include "ChatServer.h"
#include "ClientSocket.h"

ChatServer::ChatServer(QObject *parent):QTcpServer(parent)
{
}

ChatServer::~ChatServer()
{
}

void ChatServer::incomingConnection(int socketId)
{
	ClientSocket *socket = new ClientSocket(this);
    socket->setSocketDescriptor(socketId);
	connect(socket, SIGNAL(messageReceived(QString)), this, SLOT(messageFromClient(QString)));  //HIER IST DAS BESCHRIEBEN PORBLEM
}

void ChatServer::messageFromClient(QString message)
{
	
}

Wär echt Klasse wenn ihr nen Tipp hättet
Vielen Dank
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

das erinnert mich mal wieder daran, dass ich schon lange mal einen "Signals & Slots for dummies"-Artikel schreiben wollte...

Vergleich mal dein Code

Code: Alles auswählen

class ChatServer: public QTcpServer
{
public:
   ChatServer(QObject *parent = 0);
   virtual ~ChatServer();

protected slots:
   void messageFromClient(QString message);

private:
    void incomingConnection(int socketId);
}; 
mit den rot markierten Elementen bei http://de.wikipedia.org/wiki/Signal-Slo ... _und_Slots
und teile uns mit, wo der Unterschied liegt...
Nailgun
Beiträge: 22
Registriert: 3. März 2009 11:59

Beitrag von Nailgun »

Oh mein Gott,
sorry für meine Frage. Habs grad selber auch gecheckt dass in der Header nur das Q_OBJECT fehlt, ohne welches Slot und Signals ned funktionieren.

@solarix trotzdem danke für deine antwort.
vileda
Beiträge: 7
Registriert: 12. November 2007 21:47

Beitrag von vileda »

Hi,

ich habe ein sehr ähnliches Problem, der einzige unterschied ist das ich von QWidget erbe.

Wenn ich nun Q_OBJECT in meine .h einfüge bekomme ich:

Code: Alles auswählen

Undefined symbols:
"vtable for GameField", referenced from:
__ZTV9GameField$non_lazy_ptr in gamefield.o
ld: symbol(s) not found
Mein Code sieht genau so aus wie der von Nailgun.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

... aber deine pro-Datei fehlt der Eintrag für den Header.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
vileda
Beiträge: 7
Registriert: 12. November 2007 21:47

Beitrag von vileda »

Ahhh, vielen Dank!
Ich hab mich da einfach mal auf QtCreator verlassen...
Wieder schlauer ;)
Antworten