1 基于HTTP文本浏览器
1.1 问题
通过QT实现HTTP的文本浏览器。

1.2 方案
S5PV210数超文本传输协议(HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议,所有的www文件都必须遵守这个标准。HTTP是一个客户端和服务器端请求和应答的标准,客户端是终端用户,服务器端是网站,客户端通过使用Web浏览器或者其它的工具,发起一个到服务器上指定端口(默认端口为80)的HTTP请求。

QNetworkAccessManager类用于管理应用程序的发送网络请求和接收回复。Qt5采用采用共同的网络配置和设置,删除了Qt4中QFtp、QHttp等类,所有应用程序网络访问的API都是是围绕一个QNetworkAccessManager对象来进行,比如代理和缓存配置,以及处理相关的信号,监视网络的运行状态,网络相关操作的应答信号,通过该类可以管理整个Qt应用程序。QNetworkAccessManager对象创建以后,应用程序可以使用它来在网络上发送的请求,然后返回一个用于应答QNetworkReply对象。本案例将使用这两个实现一个简单浏览器。

1.3 步骤
实现此案例需要按照如下步骤进行。

步骤一:创建myHTTP工程

终端输入:qtcreator或点击桌面qt图标。启动Qt创造器。

选择菜单"file/file or project",在"新建"对话框中依次选择"application"和"QT widgets Application",并点击"choose…"

在"项目介绍和位置"中指定项目的名称为:myHTTP,并选择存储路径,Qt会在该路径下创建工程目录,点击"next"

在"kits"中选择"Desktop Qt 5.4.1 Gcc 64bit",前面打勾,点击"next"

在"Class information"中选择"QDialog"作为"Base class",并将"class name"设置为" mainwindow",勾选"Generate form",点击"next" ,点击"finsh"。

步骤二:使用设计师设计界面

双击mainwindow.ui,打开Qt设计师,开始设计界面
QT Day08
步骤三:编写源程序头文件mainwindow.h

双击mainwindow.h文件,编写头文件,代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
class QFile;
class QNetworkReply;
class QNetworkAccessManager;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void startRequest(QUrl url);

private:
Ui::MainWindow *ui;
QNetworkAccessManager *manager;//处理请求和应答
QNetworkReply *reply;//应答对象指针
QUrl url;
QUrl url2;
QFile *file;//保存下载的,文件指针
private slots:
//应答信息处理完成槽函数
void replyFinished(QNetworkReply *);
void httpFinished();
//接收应答数据
void httpReadyRead();
//更新下载进度条,
//参数:已经接收的数据大小/期望下载的总数据量
void updateDataReadProgress(qint64,qint64);
//下载按钮槽函数
void on_pushButton_clicked();
//用户名和密码
void onAuthenticationRequest(QNetworkReply *, QAuthenticator *);
//test
void click_text(QUrl);
};
#endif // MAINWINDOW_H
步骤四:编写源程序文件mainwindow.cpp。

双击mainwindow.cpp文件,编写源文件,代码如下:

#include “mainwindow.h”
#include “ui_mainwindow.h”
MainWindow::MainWindow(QWidget parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//构建QNetworkAccessManager对象
//用于应用程序发送网络请求和接收网络应答
manager = new QNetworkAccessManager(this);
//请求发出以后,应答信息处理完成发送该finished()信号
//参数即为应答的数据对象
connect(manager,SIGNAL(finished(QNetworkReply
)),
this,SLOT(replyFinished(QNetworkReply*)));
//服务器返回请求的内容之前,这个信号被发射,请求验证
//在对应的槽函数中填写密码和用户名,进行认证
connect(manager, SIGNAL(authenticationRequired(QNetworkReply *, QAuthenticator *)),
this, SLOT(onAuthenticationRequest(QNetworkReply *, QAuthenticator *)));
url2 = “http://code.tarena.com.cn/”;
//manager->get(QNetworkRequest(QUrl(“http://www.baidu.com”)));
manager->get(QNetworkRequest(url2));
#if 0
connect(ui->textBrowser,SIGNAL(sourceChanged(QUrl)),
ui->textBrowser,SLOT(setSource(QUrl)));
#elif 1
connect(ui->textBrowser,SIGNAL(anchorClicked(QUrl)),
this,SLOT(click_text(QUrl)));
#endif
//ui->textBrowser->setOpenLinks(true);
//ui->textBrowser->setOpenExternalLinks(true);
//隐藏进度条
ui->progressBar->hide();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::click_text(QUrl url){
url2 = url2.toString()+url.toString();
qDebug() << url2.toString() ;
manager->get(QNetworkRequest(QUrl(url2)));
}
void MainWindow::replyFinished(QNetworkReply *reply)
{
QString replyText = reply->readAll();
ui->textBrowser->setText(replyText);
//延后删除应答对象
reply->deleteLater();
}
//接收下载的数据并写到文件
void MainWindow::httpReadyRead()
{
if(file){
file->write(reply->readAll());
}
}
void MainWindow::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRead);
}
void MainWindow::httpFinished()
{
//隐藏进度条
ui->progressBar->hide();
//刷新文件缓冲区,保证数据都已经写入文件
file->flush();
//关闭文件
file->close();
//延后删除应答对象
reply->deleteLater();
reply = NULL;
//删除文件指针
delete file;
file = NULL;
}
void MainWindow::on_pushButton_clicked()
{
//获取要下载的url地址
//http://code.tarena.com.cn/CSDCode/csd1603/qt/day02.tar.gz
url = ui->lineEdit->text();
//获取路径
//CSDCode/csd1603/qt/day02.tar.gz
QFileInfo info(url.path());
//获取文件名
QString fileName(info.fileName());
//创建文件
file = new QFile(fileName);
if(!file->open(QIODevice::WriteOnly))
{
qDebug(“file open error”);
delete file;
file = 0;
return;
}
//发送请求,返回应答对象
reply = manager->get(QNetworkRequest(url));
//服务收到请求返回数据后产生readyReady信号
//httpReadyRead()槽函数负责接收数据
connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
//服务收到请求返回数据后也会产生downloadProgress信号
//updateDataReadProgress槽函数负责更新进度条
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));
//应答信息处理发送finished()信号,此时文件已经下载完成
connect(reply,SIGNAL(finished()),
this,SLOT(httpFinished()));
//设置显示进度条
ui->progressBar->setValue(0);
ui->progressBar->show();
}
void MainWindow::onAuthenticationRequest(QNetworkReply *, QAuthenticator *authenticator)
{
authenticator->setUser(“tarenacode”);
authenticator->setPassword(“code_2013”);
}
步骤五:编译运行

代码编辑完后,即可对工程进行编译,点击绿色按钮,即可编译运行,如果代码有错,会给出错误信息,运行结果如下图-10所示:
QT Day08
1.4 完整代码
本案例的头文件mainwindow.h完整代码如下所示:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
class QFile;
class QNetworkReply;
class QNetworkAccessManager;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void startRequest(QUrl url);

private:
Ui::MainWindow *ui;
QNetworkAccessManager *manager;//处理请求和应答
QNetworkReply *reply;//应答对象指针
QUrl url;
QUrl url2;
QFile *file;//保存下载的,文件指针
private slots:
//应答信息处理完成槽函数
void replyFinished(QNetworkReply *);
void httpFinished();
//接收应答数据
void httpReadyRead();
//更新下载进度条,
//参数:已经接收的数据大小/期望下载的总数据量
void updateDataReadProgress(qint64,qint64);
//下载按钮槽函数
void on_pushButton_clicked();
//用户名和密码
void onAuthenticationRequest(QNetworkReply *, QAuthenticator *);
//test
void click_text(QUrl);
};
#endif // MAINWINDOW_H
本案例的mainwindow.cpp完整代码如下所示:

#include “mainwindow.h”
#include “ui_mainwindow.h”
MainWindow::MainWindow(QWidget parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//构建QNetworkAccessManager对象
//用于应用程序发送网络请求和接收网络应答
manager = new QNetworkAccessManager(this);
//请求发出以后,应答信息处理完成发送该finished()信号
//参数即为应答的数据对象
connect(manager,SIGNAL(finished(QNetworkReply
)),
this,SLOT(replyFinished(QNetworkReply*)));
//服务器返回请求的内容之前,这个信号被发射,请求验证
//在对应的槽函数中填写密码和用户名,进行认证
connect(manager, SIGNAL(authenticationRequired(QNetworkReply *, QAuthenticator *)),
this, SLOT(onAuthenticationRequest(QNetworkReply *, QAuthenticator *)));
url2 = “http://code.tarena.com.cn/”;
//manager->get(QNetworkRequest(QUrl(“http://www.baidu.com”)));
manager->get(QNetworkRequest(url2));
#if 0
connect(ui->textBrowser,SIGNAL(sourceChanged(QUrl)),
ui->textBrowser,SLOT(setSource(QUrl)));
#elif 1
connect(ui->textBrowser,SIGNAL(anchorClicked(QUrl)),
this,SLOT(click_text(QUrl)));
#endif
//ui->textBrowser->setOpenLinks(true);
//ui->textBrowser->setOpenExternalLinks(true);
//隐藏进度条
ui->progressBar->hide();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::click_text(QUrl url){
url2 = url2.toString()+url.toString();
qDebug() << url2.toString() ;
manager->get(QNetworkRequest(QUrl(url2)));
}
void MainWindow::replyFinished(QNetworkReply *reply)
{
QString replyText = reply->readAll();
ui->textBrowser->setText(replyText);
//延后删除应答对象
reply->deleteLater();
}
//接收下载的数据并写到文件
void MainWindow::httpReadyRead()
{
if(file){
file->write(reply->readAll());
}
}
void MainWindow::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRead);
}
void MainWindow::httpFinished()
{
//隐藏进度条
ui->progressBar->hide();
//刷新文件缓冲区,保证数据都已经写入文件
file->flush();
//关闭文件
file->close();
//延后删除应答对象
reply->deleteLater();
reply = NULL;
//删除文件指针
delete file;
file = NULL;
}
void MainWindow::on_pushButton_clicked()
{
//获取要下载的url地址
//http://code.tarena.com.cn/CSDCode/csd1603/qt/day02.tar.gz
url = ui->lineEdit->text();
//获取路径
//CSDCode/csd1603/qt/day02.tar.gz
QFileInfo info(url.path());
//获取文件名
QString fileName(info.fileName());
//创建文件
file = new QFile(fileName);
if(!file->open(QIODevice::WriteOnly))
{
qDebug(“file open error”);
delete file;
file = 0;
return;
}
//发送请求,返回应答对象
reply = manager->get(QNetworkRequest(url));
//服务收到请求返回数据后产生readyReady信号
//httpReadyRead()槽函数负责接收数据
connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
//服务收到请求返回数据后也会产生downloadProgress信号
//updateDataReadProgress槽函数负责更新进度条
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));
//应答信息处理发送finished()信号,此时文件已经下载完成
connect(reply,SIGNAL(finished()),
this,SLOT(httpFinished()));
//设置显示进度条
ui->progressBar->setValue(0);
ui->progressBar->show();
}
void MainWindow::onAuthenticationRequest(QNetworkReply *, QAuthenticator *authenticator)
{
authenticator->setUser(“tarenacode”);
authenticator->setPassword(“code_2013”);
}

相关文章:

  • 2022-02-16
  • 2022-12-23
  • 2021-06-28
  • 2018-05-01
  • 2022-12-23
  • 2021-04-04
  • 2021-11-30
  • 2021-04-06
猜你喜欢
  • 2021-05-13
  • 2021-06-14
  • 2021-06-19
  • 2021-06-17
  • 2022-01-04
相关资源
相似解决方案