#4 jaspys
Též uvedu velmi zjednodušeně... Máš třeba takovou třídu, kde máš 2 sloty, pro čtení zprávy a odpojení klienta + jeho soket
class Client
{
Q_OBJECT
private slots:
void OnDisconnect();
void OnReadyRead();
signals:
void ReadMessage(const QString msg);
void Disconnect(Client* client);
private:
QTcpSocket socket;
};
Teď v tělě se připojíš sloty na soket:
Client::Client()
{
connect(&socket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()));
connect(&socket, SIGNAL(disconnect()), this, SLOT(OnDisconnect()));
}
void Client::OnReadyRead()
{
emit ReadMessage(socket.readAll());
}
void Client::OnDisconnect()
{
emit Disconnect(this);
}
Chápeš tak nějak? Ty privátní sloty, jsou pouze pro třídu klienta a až spracuje obsah, tak emitne výsledek třeba do třídy Server... veškerej obsah ze soketu se vykonává v této třídě, pokud chceš něco odeslat jinam, tak jedině přes vlastní signál
PS: signál connected() v klientu nedělej, ten slouží pouze pro klientskou stranu, resp. na straně serveru nefunguje, tam se používá překrytá fce v QTcpServer incommingConnection(int)
Potom teda ve tříde Server to může vypadat takto:
class Server : public QTcpServer
{
Q_OBJECT
private slots:
void OnRead(const QString msg)
{
qDebug() << msg;
}
protected:
void incommingConnection(int handle)
{
Client* client = new Client(this);
connect(client, SIGNAL(ReadMessage(QString)), this, SLOT(OnRead(QString)));
}
};
Podstatě při vytvoření instance klienta, se rovnou připojíš na signaly, který odesílat v parametru info... Psal jsem to tady, takže pokud jsem někdě něco vynechal tak sry :D ale princip je snad jasnej