qt4 convert QNetworkReply::NetworkError to QString

编程入门 行业动态 更新时间:2024-10-06 18:35:08

qt4 <a href=https://www.elefans.com/category/jswz/34/1750674.html style=convert QNetworkReply::NetworkError to QString"/>

qt4 convert QNetworkReply::NetworkError to QString

前言

要在线程中执行http post get 操作,url是配置文件中,由用户设定的。
执行http url 操作后, 需要判断是否执行成功. 如果url无效,那一定不成功。
想通过错误码来判断,并将错误码转成字符串。
找了下,网上同学的例子,都是针对QT5的。
我从QT4.7的demo工程中,找到了如何将QNetworkReply::NetworkError转成字符串

试验

刚整了一个http get操作的测试函数,在里面试验,在失败的情况下,将错误码转串,好使。

void WorkerThread3::http_get1()
{QTimer timer;// 如果不设置超时, 一个无效的url访问执行后,要默认30秒才返回,这时,会带一个错误码//// 如果设置超时时间T小于30秒,无效url访问后,在T秒后就会返回,这时错误码还是QNetworkReply::NoError// 需要判断返回内容是否为空,是否为有效内容来判断是否执行url成功了// 如果在局域网内执行一个有效的url, 3秒钟足够返回数据了timer.setInterval(3000);  // 设置超时时间, 这个时间不能设置短了,设置的太短,发生了错误,错误码也没设置成真正的错误码timer.setSingleShot(true);  // 单次触发// 因为是在线程中实现的http操作,所以阻塞执行就行了, 逻辑简单QString str_tmp;QString str_url;QNetworkReply::NetworkError err;QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);QNetworkRequest request;// Post和Get都是用于向服务器发送请求的,两者都可以带参数,只不过方式不同// 不同之处:// Get将参数直接与网址整合为一个整体// Post则将其拆为两个部分,一部分是网址,另一个部分才是参数,并且必须为其设置报文setHeader,否则服务器是无法找到参数的。str_url = QString(tr("http://%1")).arg(/*"www.baidu"*/ this->m_str_url);request.setUrl(QUrl(str_url));//getQNetworkReply* rplay = accessManager->get(request);QEventLoop eventLoop;connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit())); // 如果不想设置超时, 注释掉这行connect(accessManager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));timer.start();eventLoop.exec();       //block until finishtimer.stop();do {err = rplay->error();// test - get special err sn's stringstr_tmp = QString(tr("network error : [%1] %2")).arg(err).arg(get_network_err_string(QNetworkReply::RemoteHostClosedError));// "network error : [0] RemoteHostClosedError"if (QNetworkReply::NoError != err) {// 只有不设置超时,等accessManager完成后,才会带真正的错误码回来str_tmp = QString(tr("network error : [%1] %2")).arg(err).arg(get_network_err_string(err));// "network error : [99] UnknownNetworkError"show_ui_msg(str_tmp);return;}QByteArray rd_buf = rplay->readAll();str_tmp.clear();// 如果accessManager没有正常完成,错误码还是QNetworkReply::NoError// 所以要判断一下回包if (rd_buf.length() <= 0) {str_tmp = QString(tr("error : http get [%1]").arg(request.url().toString()));show_ui_msg(str_tmp);return;}// use recv packagestr_tmp.append(rd_buf);show_ui_msg(str_tmp); // now only show it} while (0);if (NULL != accessManager) {delete accessManager;accessManager = NULL;}
}QString WorkerThread3::get_network_err_string(QNetworkReply::NetworkError err_sn)
{const QMetaObject &mo = QNetworkReply::staticMetaObject;QMetaEnum metaEnum = mo.enumerator(mo.indexOfEnumerator("NetworkError"));return metaEnum.valueToKey(err_sn);
}

整了一个公用头文件,在每个类的头文件中包含上,这样就不用到处增补QT系统的头文件了。

// @file common_header.h
// @brief all the QT system header file used on project
// please include common_header.h on every class header#ifndef COMMON_HEADER_H
#define COMMON_HEADER_H// ui
#include <QtGui/QApplication>
#include <QDialog>#include <QMainWindow>
#include <QtGui/QHBoxLayout>
#include <QtGui/QVBoxLayout>// core
#include <QObject>// text
#include <QString>
#include <QTextCodec>// data
#include <QtCore/QSettings>
#include <QMetaEnum>
#include <QMetaType>// file
#include <QFile>
#include <QDir>// thread
#include <QThread>
#include <QDebug>// network
#include <QUrl>
#include <QtNetwork>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>#endif // COMMON_HEADER_H

更多推荐

qt4 convert QNetworkReply::NetworkError to QString

本文发布于:2024-02-16 18:03:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1690990.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:convert   QNetworkReply   QString   NetworkError

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!