欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);

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

相关标签: QT QWebSocket

上一篇:

下一篇: