nt头文件:

// http.h
#ifndef HTTP_H
#define HTTP_H
#include <QObject>
#include <QBuffer>
#include <QHttp>
#include <QUrl>class Http: public QObject
{Q_OBJECTpublic:Http(QObject *parent = 0);~Http();void setUrl(const QUrl &url);void setPort(quint16 port);void get();void post(const QString &script);bool error();QByteArray read();protected:QHttp *http;QUrl _url;QBuffer reply;quint16 _port;int _id;bool _error;protected slots:void requestStarted(int);void requestFinished(int, bool);void dataSendProgess(int, int);void dataReadProgess(int, int);void responseHeaderReceived();signals:void done();
}#endif // HTTP_H

源文件:

// http.cpp
#include "http.h"
#include <iostream>Http::Http(QObject *parent):QObject(parent)
{http = new QHttp(this);_port = 80;connect(http,SIGNAL(requestStarted(int)),this,SLOT(requestStarted(int)));connect(http,SIGNAL(requestFinished(int,bool)),this,SLOT(requestFinished(int,bool)));connect(http,SIGNAL(dataSendProgress(int,int)),this,SLOT(dataSendProgess(int,int)));connect(http,SIGNAL(dataReadProgress(int,int)),this,SLOT(dataReadProgess(int,int)));
}
Http::~Http()
{delete http;disconnect(this);QObject::~QObject();
}void Http::setUrl(const QUrl &url)
{_url = url;}
void Http::setPort(quint16 port)
{_port = port;}
void Http::get()
{http->setHost(_url.host(),_port);_id = http->get(_url.path(),&reply);
}
void Http::post(const QString &script)
{http->setHost(_url.host(),_port);_id = http->post(_url.path(),script,&reply);
}
bool Http::error()
{return _error;}
QByteArray Http::read()
{return reply;}void Http::requestStarted(int id)
{if (id != _id)return;std::cout << "正在连接至服务器"<< qPrintable(_url.host())<< " ..." << std::endl;
}
void Http::requestFinished(int id, bool error)
{if (id != _id)return;std::cout << "正在断开与服务器"<< qPrintable(_url.host())<< "的连接 ..." << std::endl;if (!error)std::cout << "成功与"<< qPrintable(_url.host())<< "交换数据" << std::endl;else{switch (http->error()){case QHttp::HostNotFound: std::cerr << "找不到指定服务器"<< qPrintable(_url.host())<< std::endl;break;case QHttp::ConnectionRefused: std::cerr << "服务器"<< qPrintable(_url.host())<< "拒绝连接请求" << std::endl;break;case QHttp::UnexpectedClose: std::cerr << "与服务器"<< qPrintable(_url.host())<< "的连接被服务器意外地关闭" << std::endl;break;case QHttp::InvalidResponseHeader: std::cerr << "响应文件"<< qPrintable(_url.path())<< "无效" << std::endl;break;case QHttp::WrongContentLength: std::cerr << "数据长度失效" << std::endl;break;case QHttp::Aborted: std::cerr << "与服务器"<< qPrintable(_url.host())<< "的连接突然中断" << std::endl;break;case QHttp::ProxyAuthenticationRequiredError: std::cerr << "与代理服务器的连接需要身份验证" << std::endl;case QHttp::AuthenticationRequiredError: std::cerr << "与服务器"<< qPrintable(_url.host())<< "的连接需要身份验证" << std::endl;break;default: std::cerr << "发生了一个未知错误" << std::endl;break;}}
}
void Http::dataSendProgess(int done, int total)
{std::cout << "正在向服务器"<< qPrintable(_url.host())<< "发送数据 ..." << std::endl<< "总数据大小: " << total << "KB" << std::endl<< "已发送数据大小: " << done << "KB" << std::endl<< "待发送数据大小: " << total-done << "KB" << std::endl<< "已发送数据占比: " << 100*done/total << "%" << std::endl<< "待发送数据占比: " << 100-100*done/total << "%" << std::endl;
}
void Http::dataReadProgess(int done, int total)
{std::cout << "正在从服务器"<< qPrintable(_url.host())<< "接受数据 ..." << std::endl;if (total)std::cout << "总数据大小: " << total << std::endl;std::cout << "已接受数据大小: " << done << std::endl;if (total)std::cout << "待接收数据大小: " << total-done << std::endl<< "已接受数据占比: " << 100*done/total << "%" << std::endl<< "待接受数据占比: " << 100-100*done/total << "%" << std::endl;
}

代码自己理解吧,这里发一个QHttp帮助文档的链接,可以自己去看一看,不过是全英文的,可以用浏览器翻译。这里给出一张post过程的流程图。

Created with Raphaël 2.2.0开始执行post发射requestStarted(id)信号是否找到指定服务器指定文件是否有效上传数据发射dataSendProgress(done,total)信号数据是否上传完毕发射responseHeaderReceived(responseHeader)信号发射dataReadProgress(done,total)信号数据是否接受完毕发射readyRead()信号发射requestFinished(id,true)信号发射done(true)信号结束发射requestFinished(id,false)信号发射done(false)信号yesnoyesnoyesnoyesno

Qt4 如何使用QHttp实现post和get相关推荐

  1. 转从Qt4 到Qt5的变化

    QT4 升级到 QT5 改动: PC部分: [改 QTDIR 变量] 在工程根目录下找到 .user 文件 ,  如 InnoTabPlugin.vcxproj.user 修改指向你的 QT5 根目录 ...

  2. 【转】qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用

    原则上,两者是不可以同时存在的,但是如果都安装了,该如何分别使用他们呢? Qt4 Visual Studio Add-in:官网可以下载安装程序,qt-vs-addin-1.1.11-opensour ...

  3. VS2010 编译 QT4.8.7 x64

    1 下载qt4.8.7源代码,解压到合适位置(如本文为d:\qt\4.8.7) 2 设置环境变量: set QMAKESPEC=win32-msvc2010 set QTDIR=d:\qt\4.8.7 ...

  4. VS2005编译QT4.8.2

    为什么要编译? 因为安装安装版的QT4.8.2,vs2005编译报错. 1.下载QT4.8.2,qt-everywhere-opensource-src-4.8.2.zip,下载vs-AddIn1.1 ...

  5. 安装QCreator2.5+Qt4.8.2+MinGW_gcc_4.4

    QCreator最近升级了.正好想试试新功能,所以把原来安装的QCreator2.3.1+Qt4.7.1卸载了.安装新的版本.具体步骤如下: 1# 下载QCreator2.5version. 2# 下 ...

  6. VS2008+QT4.8.7编译QTAV问题和解决方法

    2019独角兽企业重金招聘Python工程师标准>>> VS2008+QT4.8.7编译QTAV问题和解决方法 1.下载windows依赖文件QtAV-depends-windows ...

  7. qt4如何读oracle,Qt4编程的控制MPlayer

    本文的重点如何在QT来在GUI控制MPlayer MPlayer 的特殊用法 1.1 通过管道播放视频 mkfifo /tmp/media      // 建立管道文件 cat xxx.mpeg &g ...

  8. Qt-4.6.3移植与Qt creator开发环境建立

    最近把Qt到开发环境建立了起来,以后打算多点时间在学习Qt上面,下面是我的移植与搭建过程,现在贴出来希望能对大家有点帮助..... 作者:顾文彪 博客:http://blog.chinaunix.ne ...

  9. 在Linux上安装QT4

    比起在Windows上安装QT,在Linux上安装QT要容易多了,这都得意于Linux系统的autoconf和automake工具. 1. 将QT的源码包放至到一个目录下,笔者的目录是:/home/k ...

最新文章

  1. 数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)
  2. 【Python】猜数小游戏(文件操作)
  3. jQuery环境搭建
  4. 图像处理-HSL彩色图像均衡化
  5. 麦咖啡企业版McAfee VirusScan Enterprise v8.8授权版
  6. python矩阵乘法和转置_python简单实现矩阵的乘,加,转置和逆运算示例
  7. 群体遗传学习笔记-基础篇
  8. 求助:如何实现EA自动判断趋势,寻找高低点,并获取高低点K线价格数据,然后根据价格画出支撑阻力区域.
  9. ocr文字识别技术有什么意义
  10. java旅游管理面试,旅游管理专业面试问题
  11. PMP 考点 第三章 项目经理的角色
  12. matlab2016自带ga,[转载]MATLAB中自带遗传算法函数GA的用法
  13. [转载]尺度函数与小波函数
  14. 如何用VBA从EXCEL表取数据?问题1:1次性整体写入,还是循环写入数组呢? 问题2:取得数据后如何定位需要的那个?
  15. 奇瑞鲍思语:未来新能源小车出行发展潜力巨大
  16. shell替换和去掉换行符
  17. .Net 中关于序列化和反序列化Json的方法
  18. DELL T410服务器 重装
  19. Linux locate 作用,linux中的locate命令的详细解释
  20. c语言学生成绩统计问题分析,统计计算学生成绩类有关问题ACing

热门文章

  1. 七十一、去重交换排序链表、 求链表的中间结点
  2. 关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、语法分析、文本处理...
  3. JoSE:球面上的词向量和句向量
  4. 岗位推荐 | 微软小冰团队招聘数据挖掘/算法工程师实习生
  5. 随机迷宫 c语言思路,[原创]递归随机迷宫生成算法详解
  6. mfc 判断文件夹复制完成_Python办公自动化|自动整理文件,一键完成!
  7. java8 lambda判断_Java8新特性-Lambda表达式
  8. 【☀️~爆肝万字总结递归~❤️玩转算法系列之我如何才能掌握递归解题的能力❤️~十大经典问题助你突破极限~建议收藏☀️】
  9. spring中注解无法修饰静态变量
  10. Spring Boot 内置Tomcat——IntelliJ IDEA中配置模块目录设为文档根目录(DocumentRoot)解决方案