本框架是在个人在做项目中总结出来的一套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
#include
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 m_websocket;
std::unique_ptr m_httpRequest;
};
websocket 类
/****************************************************************************
* @brief websocket类,接收服务器的推送信息
****************************************************************************/
#include
#include
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 &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
#include
#include
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 ¶);
// 同步get请求
bool waitGet(const QUrl &url, const QVariantMap ¶,
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 &errors);
#endif
void onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator);
void onErrorOccurred(QNetworkReply::NetworkError error);
private:
void init();
QString m_serverUrl;
std::unique_ptr m_pNetworkAM;
};
qml 前端人员怎么调用事件和接收事件
Component.onCompleted: {
tool.testEnter()
}
Connections {
target: tool
function onError(shortError, longError) {
console.log(shortError, longError)
}
}
程序配置和其他封装类(配置文件类,全局数据类,调试类,通用方法类)
项目源码:test0908.rar-互联网文档类资源-CSDN下载, 欢迎互相交流