簡體   English   中英

在QT中的兩個窗口之間共享WebSocket連接

[英]Share websocket connection between two windows in QT

我創建了一個名為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的連接? 我只是不想在新窗口中重新連接。 有人知道怎么做嗎?

假設在您的整個應用程序中,您只希望按照指示進行連接,那么一個合適的模式就是單例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM