Qt通过QNetworkAccessManager实现Http网络通信

  最近在搞Qt的网络通信和音乐播放的应用,做完每一个部分都会上传上来。下面的这段代码中实现了访问百度主页,返回的信息可以再输出窗查看,代码中注释的部分是上传文件用的。QNetworkAccessManager是Qt4.4里才引入的类,qt4,.4之前一般都是使用QHttp实现。

类申明:

  1. #ifndef DIALOG_H  
  2. #define DIALOG_H  
  3. #include <QtGui/QDialog>  
  4. #include <QNetworkAccessManager>  
  5. #include <QFile>  
  6. #include <QNetworkReply>  
  7. #include <QNetworkRequest>  
  8. #include <QPushButton>  
  9. #include <QHBoxLayout>  
  10. #include <QIODevice>  
  11.   
  12. /********************HTTP实现通信******************************/  
  13. /*************************************************************/  
  14. /*************************************************************/  
  15. /*************************************************************/  
  16. class Dialog : public QDialog  
  17. {  
  18.     Q_OBJECT  
  19.   
  20. public:  
  21.     Dialog(QWidget *parent = 0);  
  22.     ~Dialog();  
  23. protected slots:  
  24.     void httpDownload();  
  25.     void replyFinished(QNetworkReply*reply);  
  26.     void onUploadProgress(qint64 bytesSent,qint64 butesTotal);  
  27.   
  28. private:  
  29.     QPushButton *download_Btn;  
  30.     QFile *file;  
  31.     QNetworkAccessManager *accessManager;  
  32.     QNetworkRequest request;  
  33.     QNetworkReply *reply;  
  34.     QHBoxLayout *layout;  
  35.   
  36.   
  37.   
  38. };  
  39.   
  40.   
  41.   
  42.   
  43. #endif // DIALOG_H  


类的实现:

  1. #include "dialog.h"  
  2. #include<QtDebug>  
  3.   
  4. Dialog::Dialog(QWidget *parent)  
  5.     : QDialog(parent)  
  6. {  
  7.     download_Btn=new QPushButton("download");  
  8.     layout=new QHBoxLayout();  
  9.     layout->addWidget(download_Btn);  
  10.     layout->sizeHint().height();  
  11.     setLayout(layout);  
  12.   
  13.     connect(download_Btn,SIGNAL(clicked()),this,SLOT(httpDownload()));  
  14.   
  15. }  
  16.   
  17. Dialog::~Dialog()  
  18. {  
  19.   
  20. }  
  21. void Dialog::httpDownload(){  
  22.     //QUrl url("http://localhost:8080/uploadtest/MyUpload");  
  23.     QUrl url("http://www.baidu.com");  
  24.     QByteArray post_data;//上传的数据可以是QByteArray或者file类型  
  25.     post_data.append("hello");  
  26.     file=new QFile("/home/vino/Desktop/a.txt");  
  27.     file->open(QIODevice::ReadOnly);//只读方式打开文件  
  28.     accessManager=new QNetworkAccessManager(this);  
  29.   
  30.     request.setUrl(url);  
  31.     /******************设置http的header***********************/  
  32.    // request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");  
  33.    // request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");//上传文件  
  34.    // request.setRawHeader("Content-Disposition","form-data;name='doc';filename='a.txt'");  
  35.     //request.setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());  
  36.   
  37.   
  38.     connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//finish为manager自带的信号,replyFinished是自定义的  
  39.     reply=accessManager->post(request,post_data);//通过发送数据,返回值保存在reply指针里.  
  40.   
  41.     //connect(reply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( onUploadProgress(qint64 ,qint64 ));//上传文件时进度  
  1.     //void QNetworkReply::downloadProgress ( qint64 bytesReceived, qint64 bytesTotal )  qt也有提供下载文件的进度   
  2.   
  3.   
  4.   
  5.   
  6. }  
  7. void Dialog::replyFinished(QNetworkReply *reply){  
  8.     //获取响应的信息,状态码为200表示正常  
  9.     QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);  
  10.   
  11.     //无错误返回  
  12.     if(reply->error() == QNetworkReply::NoError)  
  13.     {  
  14.         download_Btn->setText("success");  
  15.         QByteArray bytes = reply->readAll();    
  16.         QString result(bytes);  //转化为字符串  
  17.         qDebug()<<result;  
  18.     }  
  19.     else  
  20.     {  
  21.         //处理错误  
  22.          download_Btn->setText("failed");  
  23.     }  
  24.   
  25.     reply->deleteLater();//要删除reply,但是不能在repyfinished里直接delete,要调用deletelater;  
  26.   
  27. }  
  28.   
  29. void Dialog::onUploadProgress(qint64 bytesSent, qint64 butesTotal){  
  1. //文件上传的进度  


主函数:由Qtcreator自动生成


  1. #include <QtGui/QApplication>  
  2. #include "dialog.h"  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     Dialog w;  
  8.     w.show();  
  9.     return a.exec();  




FROM:  http://blog.csdn.net/helloxiaoyueyue/article/details/38417383?utm_source=tuicool&utm_medium=referral

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值