Qt connect信号槽多次定义,会多次触发槽函数
程序员文章站
2024-01-02 21:24:28
...
问题描述:
点击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);