Qt学习笔记网络(一)

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

新建一个控制台应用程序

看一下QNetworkAccessManager的帮助文档

需要添加Qt + =network

新建一个类

.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";
}

再在这个基础上添加一个下载功能

.h文件

#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

 

.cpp文件

主要是添加 了这三个信号

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("http://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 忽略缓存
时间: 2024-10-15 04:51:49

Qt学习笔记网络(一)的相关文章

Qt学习笔记 ListWidget的增删改

学习了一下ListWidget控件的使用,做一个小功能增删改 先把代码分解最后给出完整代码 在窗体上添加一个ListWidget 一个Horizontal Specer和  三个PushButton 效果如下 因为构造函数中的SetupUi(this)会自动将符合on_objectName_signalName()命名 的任意槽与相应的objectName的signalName()信号连接到一起 我就直接在.h文件里添加槽的声明  private slots: void on_btn_AddEv

【Qt编程】Qt学习笔记&amp;lt;三&amp;gt;

1.      如果程序中使用了png以外格式的图片,在发布程序时就要将Qt安装目录下plugins中的imagineformats文件复制到发布文件中. 2.      在函数声明处快速添加函数定义可单击函数名,按下alt+Enter键后,按下Enter键就可以进入到函数定义部分. 3.      关联槽和信号的两种方法:1.直接在设计器中用鼠标拖拽,适合于设计器中的部件间进行.2.在设计器中右击部件进入转到槽,这种方法是自动关联. 4.      我们在进行编程时,应注意:一个文件.一个类.

Qt 学习笔记 TreeWidget 增删改

在窗体上放一个TreeWidget控件和四个PushButton加一个Horizontal Spacer 布局如图 给树添加元素节点的方法和实现 .h文件 QTreeWidgetItem * AddTreeRoot(QString name,QString desc); QTreeWidgetItem * AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc); .cpp文件 QTreeWidgetItem * TreeVie

Qt学习笔记 TableWidget使用说明和增删改操作的实现

看一下效果很简单的一个小功能 先说分部讲一下过程 再给出详细代码  添加数据 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->tableWidget->setColumnCount(2); ui->tableWidget->setRowCount(2); ui->tableWidget->se

Qt学习笔记 线程(一)

Qt中的线程是与平台无关的 QThread 提供了创建一个新线程的方法 新建一个线程,继承QThread并重写它的run()当调用 start()函数时会调用重载的run()函数 例: #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread> class MyThread : public QThread { Q_OBJECT public: bool stop ; explicit MyThread(QObject *parent =

Qt学习笔记常用容器

主要说Qt的以下几种容器 1.QList<T> 2.QLinkedList<T> 3.Map<T> 和一些常用的容器方法的使用 qSort qCopy qFind 1.QList<T>泛型集合是最常用的一种容器 看一下它的常用 操作 添加删除和两个迭代器 QListIterator和QMutableListIterator #include <QCoreApplication> #include<QList> #include<

Qt学习笔记 QMessageBox

Qt的几种MessageBox 1.Infomation类型 QMessageBox::information(this,tr("hello"),tr("title")); 2.Question类型 QMessageBox::StandardButton returnBtn; returnBtn = QMessageBox::question(this,tr("hello have problem?"),tr("error!"

Qt学习笔记 信号和槽

槽和普通c++成员函数一样只可以为虚函数,也可以被重用,可以是公有的也可以是私有的,也可以被其它的c++函数调用; 参数也是任意的 唯一不同的是本槽和信号是可以连在一起的,和c#的事件差不多.相连后每当发射这个信号后就会自动调用这个槽 connection(sender,SIGNAL(signal),receiver,SLOT(slot)); sender就发送信号的Qobject指针 receiver是槽的Qobject指针 signal和slot是只有形参的函数名.SIGNAL和SLOT宏会

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为