在QT中的两个窗口之间共享websocket连接

Share websocket connection between two windows in QT

本文关键字:窗口 两个 之间 共享 连接 websocket QT      更新时间:2023-10-16

我创建了一个名为CSocket:的类

CSocket.h

#ifndef CSOCKET_H
#define CSOCKET_H
#include <QtCore/QObject>
#include <QtWebSockets/QWebSocket>
class CSocket : public QObject
{
Q_OBJECT
public:
explicit CSocket(QObject *parent = nullptr);
void onConnect(const QUrl &url);
void onSendMesssage(QString message);
signals:
void closed();
private slots:
void onConnected();
void onTextMessageReceived(QString message);
private:
QWebSocket m_webSocket;
QUrl m_url;
};
#endif // CSOCKET_H

CSocket.cpp

#include "csocket.h"
#include <QtCore/QDebug>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QMessageBox>
QT_USE_NAMESPACE
CSocket::CSocket(QObject *parent) : QObject(parent)
{
}
void CSocket::onConnect(const QUrl &url)
{
m_url = url;
connect(&m_webSocket, &QWebSocket::connected, this, &CSocket::onConnected);
connect(&m_webSocket, &QWebSocket::disconnected, this, &CSocket::closed);
m_webSocket.open(QUrl(url));
}
void CSocket::onConnected()
{
connect(&m_webSocket, &QWebSocket::textMessageReceived, this, &CSocket::onTextMessageReceived);
}
void CSocket::onTextMessageReceived(QString message)
{    
QMessageBox::information(nullptr, "Answer", message, QMessageBox::Ok);
}
void CSocket::onSendMesssage(QString message)
{
m_webSocket.sendTextMessage(message);
}

在主窗口(QWidget(中,我创建了一个连接:

CSocket *socket = new CSocket;
socket->onConnect(QUrl(QStringLiteral("ws://localhost:8080")));

现在的问题是:我如何共享与另一个QWidget或QDialog的连接?我只是不想在新窗口中重新连接。有人知道怎么做吗?

假设在整个应用程序中,您只需要一个所示的连接,那么一个合适的模式将是singleton:

csocket.h

#ifndef CSOCKET_H
#define CSOCKET_H
#include <QObject>
#include <QWebSocket>
class CSocket : public QObject
{
Q_OBJECT
public:
static CSocket *instance();
void onConnect(const QUrl &url);
void onSendMesssage(QString message);
signals:
void closed();
private slots:
void onConnected();
void onTextMessageReceived(QString message);
private:
static CSocket* m_instance;
explicit CSocket(QObject *parent = nullptr);
QWebSocket m_webSocket;
QUrl m_url;
};
#endif // CSOCKET_H

csocket.cpp

#include "csocket.h"
#include <QMessageBox>
CSocket* CSocket::m_instance = nullptr;
CSocket::CSocket(QObject *parent) : QObject(parent)
{
}
CSocket *CSocket::instance()
{
if (m_instance == nullptr)
m_instance = new CSocket;
return m_instance;
}
void CSocket::onConnect(const QUrl &url)
{
m_url = url;
connect(&m_webSocket, &QWebSocket::connected, this, &CSocket::onConnected);
connect(&m_webSocket, &QWebSocket::disconnected, this, &CSocket::closed);
m_webSocket.open(QUrl(url));
}
void CSocket::onConnected()
{
connect(&m_webSocket, &QWebSocket::textMessageReceived, this, &CSocket::onTextMessageReceived);
}
void CSocket::onTextMessageReceived(QString message)
{
QMessageBox::information(nullptr, "Answer", message, QMessageBox::Ok);
}
void CSocket::onSendMesssage(QString message)
{
m_webSocket.sendTextMessage(message);
}

因此,与其使用构造函数,不如使用instance()方法:

//mainwindow
CSocket *socket = CSocket::instance();
socket->onConnect(QUrl(QStringLiteral("ws://localhost:8080")));

// another window
CSocket *socket = CSocket::instance();

正如您所看到的,只有一个CSocket被所有窗口共享。