[英]Share websocket connection between two windows in QT
我創建了一個名為CSocket的類:
#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
#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的連接? 我只是不想在新窗口中重新連接。 有人知道怎么做嗎?
假設在您的整個應用程序中,您只希望按照指示進行連接,那么一個合適的模式就是單例:
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.