QT访问http服务器,并加载服务器图片
工程环境: QT5.9.1 & VS2015
工程的主要任务就是, 从QT界面发送HTTP请求,服务器做出响应。QT是通过 QNetworkAccessManager对请求和响应进行管理的。
大致QT界面如下(比较简单,没有美化):
1.建立工程
打开QT Creator ,文件 - 新建文件或项目,左侧项目处选择“APPlication”,右侧选择“Qt Widgets Application”,之后点击choose
根据自己的需要,更改项目名称和创建路径,点击下一步,之后选择自己的工程编译器,因为我电脑上安装的是VS2015,所以进行一下选择:
选择完成后,点击下一步,进入类信息设置界面,如下图,我将基类更改为QWidget:
点击下一步,完成即可。在项目显示栏,我们可以看到有一下文件,点击widget.ui,我们可以进行QT界面的设计。
在QT界面设计窗口,我们添加两个label,一个lineEdit,两个PushButton,一个 progressBar,进度条是用来显示加载图片或者文件的进度, 大致效果如下。然后右击加载,选择转到槽,出来如下所示,按如图选择,点击OK,会自动创建槽函数,把那个转到槽函数编辑处。
返回编辑,打开编辑widget.h如下,
打开widget.cpp,首先在构造函数中添加一下代码:
manager = new QNetworkAccessManager(this);
ui->progressBar->hide();//在刚开始需要隐藏进度条
当点击加载,会自动转到槽函数: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();//显示进度条
}
客户端发送完请求,服务器会进行响应,当服务器响应完成,开始下载,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)));//更新进度条
}
编写httpReadyRead()函数:
void widget::httpReadyRead(){
if(file) file->write(reply->readAll());//读取文件
}
编写updateDataReadProgress()函数:
void widget::updateDataReadProgress(qint64 a,qint64 b){//更新进度条
ui->progressBar->setMaximum(b);
ui->progressBar->setValue(a);
}
编写httpFinished()函数:
void widget::httpFinished(){
ui->progressBar->hide();
file->flush();
file->close();
reply->deleteLater();
delete file;
delete manager;
manager = 0;
file =0;
}
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,点击加载按钮,显示界面如下: