在 QT 中的两个窗口之间共享 websocket 连接
Posted
技术标签:
【中文标题】在 QT 中的两个窗口之间共享 websocket 连接【英文标题】:Share websocket connection between two windows in QT 【发布时间】:2018-08-07 18:53:40 【问题描述】:我创建了一个名为 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 的连接?我只是不想在新窗口中重新连接。有人知道怎么做吗?
【问题讨论】:
使用引用/指针? @wair92 解释一下?在第二个窗口中我还创建了一个 CSocket *socket = new CSocket,但它不发送消息 贴出main+创建第二个窗口的代码 @wair92 这只是一个默认窗口:主要是 QWidget,第二个是 QDialog。刚刚添加了一个 lineEdit 和 pushButton 你确定你需要QDialog/QWindow中的socket对象吗?为什么不在那里发出信号?在主窗口中连接到它并使用插槽中的套接字执行您需要的操作? 【参考方案1】:假设在您的整个应用程序中您只需要指定的连接,则合适的模式是单例:
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 被所有窗口共享。
【讨论】:
谢谢! (无法添加代表;c) @Allihopp 你已经获得了这样做的声誉:)以上是关于在 QT 中的两个窗口之间共享 websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章