我正在尝试制作服务器/客户端,但我不知道如何连接信号和插槽

时间:2010-07-04 03:27:53

标签: qt tcp signals-slots

我正在尝试在Qt中创建服务器/客户端。

TCP Server从客户端获取最多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);
}

此代码会通过将disconnected()信号连接到deleteLater()来删除内存 但我不知道如何从列表中删除指针。我如何知道哪个连接已关闭?

我想从列表中删除断开连接的QTcpSocket指针元素以管理连接。

请帮忙......

(我想如果有一个SIGNAL(断开连接(QTcpSocket *)),这一定要容易得多)

2 个答案:

答案 0 :(得分:0)

您可以使用QObject::sender()

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

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

只需将此插槽连接到disconnected()信号,即可释放内存并从列表中删除套接字。

使用sender()有一些缺点。我建议在使用前阅读docs

答案 1 :(得分:0)

像其他人一样指出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