Qt通過QNetworkAccessManager實現Http網路通訊

來源:互聯網
上載者:User

標籤:qt   http   post   網路通訊   

   最近在搞Qt的網路通訊和音樂播放的應用,做完每一個部分都會上傳上來。下面的這段代碼中實現了訪問百度首頁,返回的資訊可以再輸出窗查看,代碼中注釋的部分是上傳檔案用的。QNetworkAccessManager是Qt4.4裡才引入的類,qt4,.4之前一般都是使用QHttp實現。

類申明:

#ifndef DIALOG_H#define DIALOG_H#include <QtGui/QDialog>#include <QNetworkAccessManager>#include <QFile>#include <QNetworkReply>#include <QNetworkRequest>#include <QPushButton>#include <QHBoxLayout>#include <QIODevice>/********************HTTP實現通訊******************************//*************************************************************//*************************************************************//*************************************************************/class Dialog : public QDialog{    Q_OBJECTpublic:    Dialog(QWidget *parent = 0);    ~Dialog();protected slots:    void httpDownload();    void replyFinished(QNetworkReply*reply);    void onUploadProgress(qint64 bytesSent,qint64 butesTotal);private:    QPushButton *download_Btn;    QFile *file;    QNetworkAccessManager *accessManager;    QNetworkRequest request;    QNetworkReply *reply;    QHBoxLayout *layout;};#endif // DIALOG_H


類的實現:

#include "dialog.h"#include<QtDebug>Dialog::Dialog(QWidget *parent)    : QDialog(parent){    download_Btn=new QPushButton("download");    layout=new QHBoxLayout();    layout->addWidget(download_Btn);    layout->sizeHint().height();    setLayout(layout);    connect(download_Btn,SIGNAL(clicked()),this,SLOT(httpDownload()));}Dialog::~Dialog(){}void Dialog::httpDownload(){    //QUrl url("http://localhost:8080/uploadtest/MyUpload");    QUrl url("http://www.baidu.com");    QByteArray post_data;//上傳的資料可以是QByteArray或者file類型    post_data.append("hello");    file=new QFile("/home/vino/Desktop/a.txt");    file->open(QIODevice::ReadOnly);//唯讀方式開啟檔案    accessManager=new QNetworkAccessManager(this);    request.setUrl(url);    /******************設定http的header***********************/   // request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");   // request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");//上傳檔案   // request.setRawHeader("Content-Disposition","form-data;name='doc';filename='a.txt'");    //request.setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());    connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//finish為manager內建的訊號,replyFinished是自訂的    reply=accessManager->post(request,post_data);//通過發送資料,傳回值儲存在reply指標裡.    //connect(reply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( onUploadProgress(qint64 ,qint64 ));//上傳檔案時進度
    //void QNetworkReply::downloadProgress ( qint64 bytesReceived, qint64 bytesTotal )  qt也有提供下載檔案的進度}void Dialog::replyFinished(QNetworkReply *reply){    //擷取響應的資訊,狀態代碼為200表示正常    QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);    //無錯誤返回    if(reply->error() == QNetworkReply::NoError)    {        download_Btn->setText("success");        QByteArray bytes = reply->readAll();          QString result(bytes);  //轉化為字串        qDebug()<<result;    }    else    {        //處理錯誤         download_Btn->setText("failed");    }    reply->deleteLater();//要刪除reply,但是不能在repyfinished裡直接delete,要調用deletelater;}void Dialog::onUploadProgress(qint64 bytesSent, qint64 butesTotal){
 //檔案上傳的進度}


主函數:由Qtcreator自動產生


#include <QtGui/QApplication>#include "dialog.h"int main(int argc, char *argv[]){    QApplication a(argc, argv);    Dialog w;    w.show();    return a.exec();}





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.