qt4 convert QNetworkReply::NetworkError to QString
发布日期:2021-06-30 22:01:31 浏览次数:2 分类:技术文章

本文共 3374 字,大约阅读时间需要 11 分钟。

前言

要在线程中执行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.com"*/ this->m_str_url);    request.setUrl(QUrl(str_url));    //get    QNetworkReply* 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 finish    timer.stop();    do {        err = rplay->error();        // test - get special err sn's string        str_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 package        str_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 
#include
#include
#include
#include
// core#include
// text#include
#include
// data#include
#include
#include
// file#include
#include
// thread#include
#include
// network#include
#include
#include
#include
#include
#endif // COMMON_HEADER_H

转载地址:https://lostspeed.blog.csdn.net/article/details/100182484 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:在QT4.7中使用QJson
下一篇:QT4.7.0 产生语言文件.ts

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月21日 08时01分04秒