QT访问http服务器,并加载服务器图片

工程环境: QT5.9.1 &  VS2015

工程的主要任务就是, 从QT界面发送HTTP请求,服务器做出响应。QT是通过 QNetworkAccessManager对请求和响应进行管理的。

大致QT界面如下(比较简单,没有美化):

QT访问http服务器,并加载服务器图片

1.建立工程

打开QT Creator ,文件 - 新建文件或项目,左侧项目处选择“APPlication”,右侧选择“Qt Widgets Application”,之后点击choose

QT访问http服务器,并加载服务器图片

根据自己的需要,更改项目名称和创建路径,点击下一步,之后选择自己的工程编译器,因为我电脑上安装的是VS2015,所以进行一下选择:

QT访问http服务器,并加载服务器图片

选择完成后,点击下一步,进入类信息设置界面,如下图,我将基类更改为QWidget:

QT访问http服务器,并加载服务器图片

点击下一步,完成即可。在项目显示栏,我们可以看到有一下文件,点击widget.ui,我们可以进行QT界面的设计。

QT访问http服务器,并加载服务器图片

在QT界面设计窗口,我们添加两个label,一个lineEdit,两个PushButton,一个 progressBar,进度条是用来显示加载图片或者文件的进度, 大致效果如下。然后右击加载,选择转到槽,出来如下所示,按如图选择,点击OK,会自动创建槽函数,把那个转到槽函数编辑处。

QT访问http服务器,并加载服务器图片

QT访问http服务器,并加载服务器图片

QT访问http服务器,并加载服务器图片

返回编辑,打开编辑widget.h如下,

QT访问http服务器,并加载服务器图片

打开widget.cpp,首先在构造函数中添加一下代码:

manager = new QNetworkAccessManager(this);

ui->progressBar->hide();//在刚开始需要隐藏进度条

QT访问http服务器,并加载服务器图片

当点击加载,会自动转到槽函数:void on_pushButton_clicked()

编辑槽函数void on_pushButton_clicked()代码如下:

void Widget::on_pushButton_clicked(){

url = ui->lineEdit->text();//获取界面中输入的URL地址

QFileInfo info(url.path());//获取文件夹的绝对路径

QString fn(info.fileName());//获取需要下载文件的文件名

file = new QFile(fn);//生成一个相同文件名的文件夹,用来存放下载的内容

startRequest(url);//发送请求

ui->progressBar->setValue(0);//将进度条的值设置为0

ui->progressBar->show();//显示进度条

}

QT访问http服务器,并加载服务器图片

客户端发送完请求,服务器会进行响应,当服务器响应完成,开始下载,startRequest()函数代码如下:

void Widget::startRequest(QUrl url){

reply = manager->get(QNetworkRequest(url));//当服务器接收到请求后

connect(reply;SINGAL(finished()),this,SLOT(replyFinished(QNetworkReplty *)));//显示图片

connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));//服务器响应请求后,开始下载内容

connect(reply,SINGAL(finished()),this,SLOT(httpFinished()));//下载完成后,关闭文件

connect(reply,SINGAL(finished()),this,SLOT(updateDataReadProgress(qint64,qint64)));//更新进度条

}

QT访问http服务器,并加载服务器图片

编写httpReadyRead()函数:

void widget::httpReadyRead(){

if(file) file->write(reply->readAll());//读取文件

}

QT访问http服务器,并加载服务器图片

编写updateDataReadProgress()函数:

void widget::updateDataReadProgress(qint64 a,qint64 b){//更新进度条

ui->progressBar->setMaximum(b);

ui->progressBar->setValue(a);

}

QT访问http服务器,并加载服务器图片

编写httpFinished()函数:

void widget::httpFinished(){

ui->progressBar->hide();

file->flush();

file->close();

reply->deleteLater();

delete file;

delete manager;

manager = 0;

file  =0;
}

QT访问http服务器,并加载服务器图片

void Widget::replyFinished(QNetworkReply *reply){ //显示图片
ui->progressBar->hide();
QMovie *mov = new QMovie(reply);
mov->setScaledSize(ui->label->size());//自适应label的大小
ui->label->setMovie(mov);
mov->start();
}

运行编译,在URL输入:http://localhost:88/123.jpg,点击加载按钮,显示界面如下:

QT访问http服务器,并加载服务器图片