Seite 1 von 1

SLOT wird nicht gefunden

Verfasst: 5. März 2009 16:11
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

Verfasst: 5. März 2009 17:07
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...

Verfasst: 5. März 2009 17:12
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.

Verfasst: 18. März 2009 18:18
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.

Verfasst: 18. März 2009 18:28
von Christian81
... aber deine pro-Datei fehlt der Eintrag für den Header.

Verfasst: 18. März 2009 18:38
von vileda
Ahhh, vielen Dank!
Ich hab mich da einfach mal auf QtCreator verlassen...
Wieder schlauer ;)