Qt学习笔记-http服务的初步认识(使用程序下载网站上的图片)

583 篇文章 127 订阅

关键是:QNetworkAccessManager类用来协调网络操作,可以调度创建好的请求,并发射信号来报告进度。

运行截图如下:


代码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class QNetworkReply;
class QNetworkAccessManager;
#include <QUrl>
class QFile;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void startRequest(QUrl url);

private slots:
    void httpFinished();
    void httpReadyRead();
    void updateProgress(qint64,qint64);
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    QNetworkAccessManager *manager;
    QNetworkReply *reply;
    QUrl url;
    QFile *file;

};

#endif // WIDGET_H


widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QtNetwork>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("CSDN IT1995");
    manager=new QNetworkAccessManager(this);
    ui->progressBar->hide();
    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(on_pushButton_clicked()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::startRequest(QUrl url)
{
    reply=manager->get(QNetworkRequest(url));
    connect(reply,&QNetworkReply::readyRead,this,&Widget::httpReadyRead);
    connect(reply,&QNetworkReply::downloadProgress,this,&Widget::updateProgress);
    connect(reply,&QNetworkReply::finished,this,&Widget::httpFinished);
}

void Widget::httpFinished()
{
    ui->progressBar->hide();
    if(file){
        file->close();
        delete file;
        file=0;
    }
    reply->deleteLater();
    reply=0;
}

void Widget::httpReadyRead()
{
    if(file)
        file->write(reply->readAll());
}

void Widget::updateProgress(qint64 byteRead, qint64 totalBytes)
{
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(byteRead);
}

void Widget::on_pushButton_clicked()
{
    url=ui->lineEdit->text();
    QFileInfo info(url.path());
    QString fileName(info.fileName());
    if(fileName.isEmpty())
        fileName="index.html";
    file=new QFile(fileName);
    if(!file->open(QIODevice::WriteOnly)){
        delete file;
        file=NULL;
        return;
    }
    startRequest(url);
    ui->progressBar->setValue(0);
    ui->progressBar->show();
}


main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值