Qt connect信号槽多次定义,会多次触发槽函数

问题描述:
点击Websocket【连接】按钮的时候将open连接到指定的地址,websocket在连接成功后会发出 connected信号;同时我们在初始化的时候就将,connected信号和我们的onconnected()函数建立连接;

onconnected()函数,用于将接收到新的消息和我们的接收消息处理的槽函数绑定起来,以及做一些连接后的处理工作;

void CWebSocketTool::innit()
{
    //初始化创建的连接,是否应该放到一List上去存储?
    connect(m_webSocket, &QWebSocket::connected, this, &CWebSocketTool::onConnected);
    connect(m_webSocket, &QWebSocket::disconnected, this, &CWebSocketTool::closed);
 

}

void CWebSocketTool::onConnected()
{
    //这里不应该为true,因为握手了并不代表认证成功
    //m_connectstatu = true;
       connect(m_webSocket, &QWebSocket::textMessageReceived,this, &CWebSocketTool::onTextMessageReceived);
}

注意上面这个onconnected()函数实现的功能:
每次调用这个函数的时候,就会重新连接一次信号槽。

多次点击Websocket【连接】按钮,每次都连接成功的情况下。会多次执行onconnected()函数,导致创建多个信号与槽函数的连接

当后面连接成功后,通过websocket接收到新消息,触发 textMessageReceived信号,接收到一条消息会多次触发  onTextMessageRecevied 函数。

修改之后

void CWebSocketTool::innit()
{
    //初始化创建的连接,是否应该放到一List上去存储?
    connect(m_webSocket, &QWebSocket::connected, this, &CWebSocketTool::onConnected);
    connect(m_webSocket, &QWebSocket::disconnected, this, &CWebSocketTool::closed);

    connect(m_webSocket, &QWebSocket::textMessageReceived,this, &CWebSocketTool::onTextMessageReceived);
}

void CWebSocketTool::onConnected()
{
    //这里不应该为true,因为握手了并不代表认证成功
    //m_connectstatu = true;

}

将connect建立部分,放到初始化部分,只实例化时调用一次,避免了多次创建connect信号与槽的问题

其实问题的根本原因:就是要避免多次创建信号与槽。 多了解一下信号与槽的建立机制,或者在使用的时候,加上限制参数

connect(m_webSocket, &QWebSocket::textMessageReceived,this, &Widget::onTextMessageReceived,Qt::UniqueConnection);

你可能感兴趣的:(QT,QWebSocket)