QT中QWebSocket.open函数使用问题及参数配置咨询
QT QWebSocket 连接配置与消息发送解决方案
一、修复核心连接代码
你的现有代码存在两个关键问题:调用了aboutToClose()(这是信号而非主动关闭方法),且未配置自定义请求头。以下是修正后的连接代码:
void MainWindow::onWatchListChanged() { // 主动关闭现有连接(替换错误的aboutToClose()调用) if (m_webSocket.isOpen()) { m_webSocket.close(); } QUrl wsUrl("ws://rt.test.com/ws2/"); QNetworkRequest request(wsUrl); // 添加Postman中设置的token请求头 request.setRawHeader("token", "weirskldlfjoew"); qDebug() << "连接目标地址:" << wsUrl; m_webSocket.open(request); }
二、连接成功后发送订阅消息
需要监听connected()信号,确保连接建立完成后再发送Postman中的订阅消息。首先在类初始化(如构造函数)中绑定信号槽:
// MainWindow构造函数内添加 connect(&m_webSocket, &QWebSocket::connected, this, &MainWindow::onWebSocketConnected); connect(&m_webSocket, &QWebSocket::disconnected, this, &MainWindow::onWebSocketDisconnected); // 绑定错误信号用于排查问题 connect(&m_webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::errorOccurred), this, &MainWindow::onWebSocketError);
然后实现消息发送的槽函数:
void MainWindow::onWebSocketConnected() { qDebug() << "WebSocket连接成功"; // 构造Postman中的订阅消息(使用Raw字符串避免转义问题) const QString subscribeMsg = R"({"channels": ["I1-23", "I1035-23"]})"; // 发送文本消息 m_webSocket.sendTextMessage(subscribeMsg); }
三、错误排查辅助实现
添加错误与断开连接的处理槽,方便定位问题:
void MainWindow::onWebSocketError(QAbstractSocket::SocketError error) { qDebug() << "WebSocket错误信息:" << m_webSocket.errorString(); } void MainWindow::onWebSocketDisconnected() { qDebug() << "WebSocket连接断开"; }
关键注意事项
- 不要调用
aboutToClose():这是QWebSocket发出的通知信号,用于告知外部即将关闭连接,不是主动关闭连接的方法,主动关闭请用close()。 - 自定义Header必须通过QNetworkRequest:直接调用
open(QUrl)无法设置请求头,必须封装为QNetworkRequest对象传入。 - 消息发送时机:订阅消息必须在
connected()信号触发后发送,避免连接未建立时发送失败。
内容的提问来源于stack exchange,提问作者steven cn2018
相关产品推荐
相关产品推荐

