天天看點

Qt學習筆記網絡(一)

Qt5 移除了QHttp是因為功能重複 用QNetworkAccessManager完全能搞定

建立一個控制台應用程式

看一下QNetworkAccessManager的幫助文檔

Qt學習筆記網絡(一)
需要添加Qt + =network
Qt學習筆記網絡(一)

建立一個類

.h檔案

#ifndef DOWNPAGES_H
#define DOWNPAGES_H
#include<QNetworkAccessManager>
#include <QObject>

class DownPages : public QObject
{
    Q_OBJECT
public:
    explicit DownPages(QObject *parent = 0);
    void Do_Download();
signals:

public slots:
void replyFinished(QNetworkReply*);
private :
    QNetworkAccessManager *manager;
};

#endif // DOWNPAGES_H      

我們聲明了一個 QNetworkAccesManager

在.cpp裡我們把它初始化并把它的finshed信号關聯槽

并判斷狀态是如果 是200也就是請求正常狀态把頁面輸出 

.cpp檔案

#include "downpages.h"
#include <QNetworkRequest>
#include<QNetworkReply>
#include<QDebug>
#include<QTextCodec>
DownPages::DownPages(QObject *parent) :
    QObject(parent)
{
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(replyFinished(QNetworkReply*)));

    QUrl url;
    //url.setUrl("http://www.cnblogs.com/a/b");
    //url.setUrl("http://www.baidu.com/");
    url.setUrl("http://www.sibaieteco.com/");
    //url.setUrl("www.abaibduc.com");
    QNetworkRequest request(url);

    manager->get(request);
}

void DownPages::Do_Download()
{

}
/*
 * 請求完成
 *
 *
 */
void DownPages::replyFinished(QNetworkReply * reply)
{
    //檢視是否有錯誤
    switch(reply->error())
    {
    //如果沒有錯誤把頁面輸出
    case QNetworkReply::NoError:
        qDebug()<<"no error";

    {
        QTextCodec * cod=QTextCodec::codecForName("utf-8");
        QString str=cod->toUnicode(reply->readAll());
        qDebug()<<str;
    }
        break;
    case QNetworkReply::ContentNotFoundError:
    {
        QUrl failedUrl;
        failedUrl = reply->request().url();
        int httpStatus = reply->attribute(
                    QNetworkRequest::HttpStatusCodeAttribute).toInt();
        QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString();
        qDebug()<<"url"<<failedUrl <<httpStatus<<"   "<<reason;
    }
        break;
    default:
    {
        qDebug()<<"Have error"<<reply->errorString()<<" error "<<reply->error();
    }
    }
    qDebug()<<"finished";
}      

再在這個基礎上添加一個下載下傳功能

#ifndef DOWNPAGES_H
#define DOWNPAGES_H
#include<QNetworkAccessManager>
#include <QObject>
#include <QFile>
class QNetworkReply;

class DownPages : public QObject
{
    Q_OBJECT
public:
    explicit DownPages(QObject *parent = 0);
    void Do_Download();
signals:

public slots:
void replyFinished(QNetworkReply*);
void readyRead();
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void downFinished();
private :
    QNetworkAccessManager *manager;
    QNetworkReply * managerReply;
    QFile *file;

};

#endif // DOWNPAGES_H      

主要是添加 了這三個信号

managerReply  = manager->get(request);
    connect(managerReply,SIGNAL(readyRead()),this,SLOT(readyRead()));
    connect(managerReply,SIGNAL(downloadProgress(qint64,qint64)),
            this,SLOT(downloadProgress(qint64,qint64)));
    connect(managerReply,SIGNAL(finished()),this,SLOT(downFinished()));      

readyRead()開始下載下傳資料

DownloadProgress顯示下載下傳的進度

還有一個finished

#include "downpages.h"
#include <QNetworkRequest>
#include<QNetworkReply>
#include<QDebug>
#include<QTextCodec>
#include<QFileInfo>
#include<QDir>
DownPages::DownPages(QObject *parent) :
    QObject(parent)
{
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(replyFinished(QNetworkReply*)));

    QUrl url;
    //url.setUrl("http://www.cnblogs.com/a/b");
    //url.setUrl("http://www.baidu.com/");
    //url.setUrl("http://www.sibaieteco.com/");
    url.setUrl("https://files.cnblogs.com/li-peng/WPFMultLanguageDemo.rar");
    QNetworkRequest request(url);

    managerReply  = manager->get(request);
    connect(managerReply,SIGNAL(readyRead()),this,SLOT(readyRead()));
    connect(managerReply,SIGNAL(downloadProgress(qint64,qint64)),
            this,SLOT(downloadProgress(qint64,qint64)));
    connect(managerReply,SIGNAL(finished()),this,SLOT(downFinished()));
}

void DownPages::Do_Download()
{

}

void DownPages::replyFinished(QNetworkReply * reply)
{

    switch(reply->error())
    {

    case QNetworkReply::NoError:
        qDebug()<<"no error";

    {
        QTextCodec * cod=QTextCodec::codecForName("utf-8");
        QString str=cod->toUnicode(reply->readAll());
        //qDebug()<<str;
    }
        break;
    case QNetworkReply::ContentNotFoundError:
    {
        QUrl failedUrl;
        failedUrl = reply->request().url();
        int httpStatus = reply->attribute(
                    QNetworkRequest::HttpStatusCodeAttribute).toInt();
        QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString();
        qDebug()<<"url"<<failedUrl <<httpStatus<<"   "<<reason;
    }
        break;
    default:
    {
        qDebug()<<"Have error"<<reply->errorString()<<" error "<<reply->error();
    }
    }
    qDebug()<<"finished";
}

void DownPages::readyRead()
{
    QFileInfo fileinfo(managerReply->url().path());
    QString thefileName = fileinfo.fileName().isEmpty()?"index.html":fileinfo.fileName();

    QString thePath ="E:/Test/Down/";
    //qDebug()<<thePath;
    QDir createfile;
    bool exist = createfile.exists(thePath);
    if(!exist)
    {
        createfile.mkpath(thePath);
    }
    thePath +=thefileName;
    file=new QFile(thePath);

//    if(file->open(QIODevice::Append))
//    {
//        file->write(managerReply->readAll());
//        file->flush();
//        file->close();
//    }
    if(file->open(QIODevice::Append ))
    {
        file->write(managerReply->readAll());
        qDebug()<<"flu";
        file->flush();
    }
    //delete file;
}

void DownPages::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
    qDebug()<<"Total:  "<<bytesTotal<<"  current received : "<<bytesReceived;
}

void DownPages::downFinished()
{
    file->flush();
    file->close();
    delete file;
}      
file->open(QIODevice::Append)      
枚舉值 描述

QIODevice::NotOpen

未打開

QIODevice::ReadOnly

以隻讀方式打開

QIODevice::WriteOnly

以隻寫方式打開

QIODevice::ReadWrite

以讀寫方式打開

QIODevice::Append

以追加的方式打開,新增加的内容将被追加到檔案末尾

QIODevice::Truncate

以重寫的方式打開,在寫入新的資料時會将原有資料全部清除,遊标設定在檔案開頭。

QIODevice::Text

在讀取時,将行結束符轉換成 \n;在寫入時,将行結束符轉換成本地格式,例如 Win32 平台上是 \r\n

QIODevice::Unbuffered

忽略緩存

作者:李鵬

出處:http://www.cnblogs.com/li-peng/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀