Я пытаюсь сделать сервер / клиент, но я не знаю, как подключить сигналы и слоты - PullRequest
0 голосов
/ 04 июля 2010

Я пытаюсь сделать сервер / клиент в Qt.

TCP-сервер принимает максимум 4 подключения от клиента.

Для создания ...

// server.h
class Server : public QTcpServer{
    ...
    QList<QTcpSocket *> list;
}

// server.cpp
Server::start(){
    QTcpSocket *curr = nextPendingConnection();
    connect(curr, SIGNAL(disconnected()), curr, SLOT(deleteLater()));
    list.append(curr);
}

Этот код удалит память, подключив сигнал disnected () к deleteLater (), но я не знаю, как удалить указатель из списка.Как узнать, какое соединение закрыто?

Я хочу удалить отключенный элемент указателя QTcpSocket из списка для управления соединениями.

, пожалуйста, помогите ...

(думаю, еслибыл СИГНАЛ (отключен (QTcpSocket *)), это должно быть намного проще)

Ответы [ 2 ]

0 голосов
/ 04 июля 2010

Как и другие указали, qobject :: sender должен работать

Server::start(){
    QTcpSocket *curr = nextPendingConnection();
    connect(curr, SIGNAL(disconnected()), curr, SLOT(deleteLater()));
    connect(curr, SIGNAL(disconnected()), this, SLOT(onDisconection()));
    list.append(curr);
}

void onDisconection()
{
  list.removeOne(qobject_cast<QTcpSocket*>(sender()));
}

, но, как сказал отправитель, у него есть некоторые недостатки, и я предлагаю использовать преобразователь сигналов, см. http://doc.qt.io/qt-5/qsignalmapper.html

0 голосов
/ 04 июля 2010

Вы можете использовать QObject::sender():

void onDisconnect()
{
    QTcpSocket sock = qobject_cast<QTcpSocket*>(sender());

    if (sock != 0)
    {
        list.removeAll(sock);
        sock->deleteLater();
    }
}

Просто подключите этот слот к сигналу disconnected(), и память будет освобождена, а сокет удален из списка.

Использование sender() имеет некоторые недостатки. Я предлагаю прочитать документы перед его использованием.

...