一、通过 QTimer 超时实现控制QNetworkReply请求时间,通过调用reply->close()触发QNetworkReply::finished信号,进行数据处理。
代码.h
#ifndef REPLYTIMEOUT_H
#define REPLYTIMEOUT_H
#include <QObject>
class QNetworkReply;
class ReplyTimeout : public QObject
{
Q_OBJECT
public:
ReplyTimeout(QNetworkReply* reply, const int timeout);
private slots:
void replyTimeout();
};
#endif // REPLYTIMEOUT_H
.cpp
#include <QNetworkReply>
#include <QTimer>
#include "replytimeout.h"
ReplyTimeout::ReplyTimeout(QNetworkReply *reply, const int timeout)
{
if (reply) {
setParent(reply);
QTimer::singleShot(timeout, this, &ReplyTimeout::replyTimeout);
}
}
void ReplyTimeout::replyTimeout()
{
QNetworkReply* reply = qobject_cast<QNetworkReply*>(parent());
if (reply) {
reply->close();
}
}
调用方法:
QNetworkReply *HttpClient::requestQrCode(const QString &clientId, const QString &deviceId, const QString &uuid,
const int &scene, const QString &redirectUrl, const int &sceneType,
const QString &gender, const QString &school, const QString &defaultAvatar,
const QString &nick)
{
QJsonObject json2;
json2.insert("gender", gender);
json2.insert("school", school);
QJsonObject json1;
json1.insert("clientId", clientId);
json1.insert("deviceId", deviceId);
json1.insert("uuid", uuid);
json1.insert("scene", scene);
json1.insert("sceneType", sceneType);
json1.insert("defaultAvatarEnum", defaultAvatar);
json1.insert("nick", nick);
json1.insert("remark", json2);
QJsonObject jsonRoot;
jsonRoot.insert("codeInfoDTO", json1);
jsonRoot.insert("redirectUrl", redirectUrl);
qInfo() << "requset" << QJsonDocument(jsonRoot).toJson(QJsonDocument::Compact);
QNetworkRequest requset = setNetWorkRequest("/qrcode/generating");
QNetworkReply *replay = httpRequset("post", requset, QJsonDocument(jsonRoot).toJson(QJsonDocument::Compact));
//调用超时类
new ReplyTimeout(replay, 3000);
return replay;
二、Http请求报错处理
//请求连接服务器
QNetworkReply *reply = HttpClient::instance()->requestQrCode("", hardwareID, uuid, 8, "", BindorUnbind, gender, QString::number(chirdinfo.grade),
chirdinfo.avatar, chirdinfo.name);
//绑定finised信号,数据处理
connect(reply, &QNetworkReply::finished, this, &BindingDialog::onRequestQrCodeResult);
//reply错误后,断开连接(例:服务器连接失败等错误,可进行分类处理)
connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),
this, [=] {
reply->disconnect();
reply->close();
reply->abort();
reply->deleteLater();
});

本文介绍如何使用QTimer和QNetworkReply的超时机制,配合replyTimeout槽函数,实现HTTP请求的定时关闭,并处理QNetworkReply的错误状态。实例中详细展示了如何在3秒后自动断开网络请求并进行后续数据处理。

847

被折叠的 条评论
为什么被折叠?



