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

忽略缓存


本文转自lpxxn博客园博客,原文链接:http://www.cnblogs.com/li-peng/p/3656613.html,如需转载请自行联系原作者

相关文章
|
13天前
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
20 0
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
37 8
C++ Qt开发:QTcpSocket网络通信组件
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
56 0
|
13天前
|
开发框架 数据可视化 前端开发
【Qt 学习笔记】Qt控件概述
【Qt 学习笔记】Qt控件概述
21 0
|
1月前
|
网络协议 网络安全 API
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
45 1
|
1月前
|
域名解析 缓存 网络协议
探索Qt 网络编程:网络地址与服务类全解析
探索Qt 网络编程:网络地址与服务类全解析
55 0
|
1月前
|
网络协议 安全 网络安全
Qt 套接字类(QTcpSocket和QUdpSocket)解密:迈向 Qt 网络编程之巅
Qt 套接字类(QTcpSocket和QUdpSocket)解密:迈向 Qt 网络编程之巅
98 0
|
1月前
|
安全 Linux 网络安全
Qt SSL/TLS 安全通信类:构建安全网络应用的关键组件
Qt SSL/TLS 安全通信类:构建安全网络应用的关键组件
64 0
|
1月前
|
存储 网络安全 C++
C++ Qt开发:QUdpSocket网络通信组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QUdpSocket`组件实现基于UDP的网络通信功能。与`QTcpSocket`组件功能类似,`QUdpSocket`组件是 Qt 中用于实现用户数据报协议(UDP,User Datagram Protocol)通信的类。UDP 是一种无连接的、不可靠的数据传输协议,它不保证数据包的顺序和可靠性,但具有低延迟和简单的特点。
20 0
C++ Qt开发:QUdpSocket网络通信组件
|
1月前
|
开发框架 安全 网络安全
Qt5.14.2揭秘Qt与SSL/TLS的完美邂逅:打造坚不可摧的网络安全防线
Qt5.14.2揭秘Qt与SSL/TLS的完美邂逅:打造坚不可摧的网络安全防线