在 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 连接的主要内容,如果未能解决你的问题,请参考以下文章

qt窗口之间如何通信或信息共享?(C++版)

qt窗口之间如何通信或信息共享?(C++版)

qt窗口之间如何通信或信息共享?(C++版)

在 QT 中的两个 QWidget 表单之间传递参数

是否可以在 Qt 的***窗口之间使用相同的 OpenGL 上下文?

如何在 django 服务器和 python websocket 服务器之间共享数据