QT客户端框架(http + websocket+QML)

本框架是在个人在做项目中总结出来的一套Qt客户端框架,基于http调用接口和websocket接收服务器通知,前端使用qml。 其中业务请求逻辑使用的是C++逻辑。为了后期方便使用,特此记录下来方便以后客户端的搭建。

框架简介:

1.本框架采用Qml写前端页面,页面逻辑使用JS, 请求接收逻辑采用C++。

2.事件中转单例,qml和C++可同时开发,通过事件中转隔离前端和逻辑。

3. 基本配置文件类和全局变量类和调试类使得开发业务更加方便。

4.C++多线程部分亲测没问题。业务请求和接收全部在自己单独的线程中。

代码简介:

事件中转单例模式:Tool类

public:
    static Tool* getInstance();

signals:
    //前端调用
    void testEnter();
    
    //后端抛出
    void error(const QString &shortError, const QString &longError);


后端业务逻辑开启类

/****************************************************************************
 * @brief  事件处理,后端事件接收类
 * 主线程:处理中转事件
 * 线程1:websocket线程,接收服务器推送信息
 * 线程2: http线程, 调用服务器接口
 ****************************************************************************/
#include <QObject>
#include <memory>
class Tool;
class Tool_websocket;
class Tool_httpRequest;

class Tool_transfer : public QObject
{
    Q_OBJECT
public:
    explicit Tool_transfer(QObject *parent = nullptr);
    ~Tool_transfer();
signals:  
    void start(); //启动所有线程

private slots:
    void onError(const QString &shortError, const QString &longError = QString());
    void onTestEnter();
private:
    void init();
    std::unique_ptr<Tool_websocket> m_websocket;
    std::unique_ptr<Tool_httpRequest> m_httpRequest;
};

websocket 类


/****************************************************************************
 * @brief  websocket类,接收服务器的推送信息
 ****************************************************************************/
#include <QObject>
#include <QWebSocket>

class Tool_websocket : public QObject
{
    Q_OBJECT
public:
    explicit Tool_websocket(QObject *parent = nullptr);
    ~Tool_websocket();
signals:
    //调用
    void start();
    //抛出
    void error(const QString &shortError, const QString &longError = QString());

private slots:
    void onStart();
    void onConnected();
    void onDisconnected();
    void onError(QAbstractSocket::SocketError error);
#ifndef QT_NO_SSL
    void onSslErrors(const QList<QSslError> &errors);
#endif
    void onTextMessageReceived(const QString &message);
    void onBinaryMessageReceived(const QByteArray &data);

private:

     QWebSocket * m_pWebSocket;
};

websocket心跳

    //定时器处理重连
    m_timerConn = new QTimer(this);
    connect(m_timerConn, SIGNAL(timeout()), this, SLOT(checkConn()));
    m_timerConn->setInterval(3000);

    //定时器发送心跳
    m_timerHeart = new QTimer(this);
    connect(m_timerHeart, SIGNAL(timeout()), this, SLOT(sendHeart()));
    m_timerHeart->setInterval(2000);


void Tool_websocket::checkConn()
{
    QDateTime now = QDateTime::currentDateTime();
    if (m_lastTime.secsTo(now) >= m_timeOut) {     //当前时间和上次接收到消息的时间 > 设置的超时时间, 若心跳(2秒一次)正常,永远不会重连
        xdebug << "正在重连!";
        isConnection = false;
        m_pWebSocket->open(m_serverUrl);
    }
}

httpBase类


/****************************************************************************
 * @brief  http接口调用类,封装了常用和基本的http请求接口
 ****************************************************************************/

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>


class Tool_httpbase : public QObject
{
    Q_OBJECT
public:
    explicit Tool_httpbase(QObject *parent = nullptr, QString serverUrl = "");
    ~Tool_httpbase();

    // 异步get请求
    void get(const QUrl &url, const QVariantMap &para);
    // 同步get请求
    bool waitGet(const QUrl &url, const QVariantMap &para,
        QJsonObject &responseJsonObject, QString &shortError, QString &longError);
    // 同步get下载文件
    bool waitGet(const QUrl &url, QByteArray &fileData,
        QString &shortError, QString &longError);
    // 异步post请求
    void post(const QUrl &url, const QJsonObject &body);
    // 同步post请求
    bool waitPost(const QUrl &url, const QJsonObject &body,
        QJsonObject &responseJsonObject, QString &shortError, QString &longError);
    // 异步post传输表单文件
    void post(const QUrl &url, QHttpMultiPart *multiPart);
    // 同步post传输表单文件
    bool waitPost(const QUrl &url, QHttpMultiPart *multiPart,
        QJsonObject &responseJsonObject, QString &shortError, QString &longError);
signals:
    void response(const QJsonObject &reponse);
    void error(const QString &shortError, const QString &longError = QString());

private slots:
    void onHttpFinished(QNetworkReply *reply);
    void onHttpReadyRead();
#ifndef QT_NO_SSL
    static void onSslErrors(QNetworkReply *reply, const QList<QSslError> &errors);
#endif
    void onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator);
    void onErrorOccurred(QNetworkReply::NetworkError error);

private:
    void init();

    QString m_serverUrl;
    std::unique_ptr<QNetworkAccessManager> m_pNetworkAM;
};

qml 前端人员怎么调用事件和接收事件

    Component.onCompleted: {
        tool.testEnter()
    }
    Connections {
        target: tool
        function onError(shortError, longError) {
            console.log(shortError, longError)
        }
    }

程序配置和其他封装类(配置文件类,全局数据类,调试类,通用方法类)

 项目源码:test0908.rar-互联网文档类资源-CSDN下载, 欢迎互相交流

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YanWenCheng_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值