界面基本差不多了,现在我们来做实质功能。
首先,我们要将视频网址发到我们的解析程序上,我用PHP做了一个解析程序,放到了网上。所以我要让QT用post的方式将我们要解析的网址发送过去,然后网上的解析程序把解析完的下载网址再用json格式反回来给我们的QT程序,这样我们就能下载了。
这就是本节要搞的重点,经过搜索,QT中访问http网址要用这两个类:
QNetworkAccessManager
QNetworkRequest
第一个QNetworkAccessManager类,是网络的载体类,它负责网络的请求和通信管理。而QNetworkRequest是一个负责给QNetworkAccessManager发送起始请求的角色,它发起请求后QNetworkAccessManager就会开始进行处理并创建事件。
所以我们要做的流程基本是:
0、定义一个全局的QNetworkAccessManager,然后设置信号槽响应它的事件。
1、用 QByteArray存储要post的参数。
2、用QNetworkRequest创建网络访问的请求
3、在QNetworkAccessManager槽事件处理返回的数据
有个疑问:访问网络是自动创建一个新线程,还是阻塞当前线程?
不管了,先做做看。
首先在mainwindow.h里定义私有变量
QNetworkAccessManager *nam;
然后定义槽函数
private slots:
void finishedSlot(QNetworkReply *reply);
别忘了要先
#include <QtNetwork/QNetworkAccessManager>
然后在mainwindow的构造函数里创建它的实例并绑定槽函数:
nam = new QNetworkAccessManager(this);
QObject::connect(nam, SIGNAL(finished(QNetworkReply*)),
this, SLOT(finishedSlot(QNetworkReply*)));
记得一定要设置那个this,要不然就得手动delete它了。
然后实现槽响应函数:
void MainWindow::finishedSlot(QNetworkReply *reply){
// 网络访问的槽响应函数
// HTTP状态码
QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
// 重定向了没有,如果有,这里就是重定向的网址
QVariant redirectionTargetUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
// 如果没有错误发生
if (reply->error() == QNetworkReply::NoError)
{
//读取服务器返回的数据流(json)
QByteArray bytes = reply->readAll(); // bytes
//转换为字符串
QString string = QString::fromUtf8(bytes);
echo(string);
}
else
{
// 发生了http错误
echo(reply->errorString());
}
reply->deleteLater();
}
然后在“开始下载”按钮的点击事件里构造post参数,并用post模式发起http访问。
void MainWindow::on_btn_startDownload_clicked()
{
//点击了开始下载按钮
lb_statusText->setText("正在解析...");
ui->statusbar->addWidget(pb_statusProgress,1);
QUrl url("为了安全,我在这里没有写请求网址。");
QByteArray param;
param.append("url=");
param.append(ui->le_VideoUrl->text());
//设置请求头
QNetworkRequest request;
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
request.setHeader(QNetworkRequest::ContentLengthHeader, param.length());
nam_HTTP->post(request, param);
}
到这里,用post模式访问http就基本成了,正常的运行结果是会返回一个JSON字符串。
但是,当我点击运行后,弹出来了好多这种类型的编译错误:undefined reference to xxxxx啥啥啥的。
见鬼了,我了个去。。。
大概意思是找不到某个变量的定义。
但是检查了半天,代码里始终是找不到错误的。
而且网上的资料也没有具体说些要注意的。
经过了再三的搜索,才发现,要修改工程配置文件,就是那个.pro文件,这个文件的第一行是: QT += core gui,这个时候,这个工程是没有网络访问权限的,一切的关于网络的类,都会被屏蔽,这才出的这些错误,我们只需要把它改成QT += core gui network就可以了,也就是加一个network,保存,编译,成功。
粘贴一个网址,然后点击下载进行解析,一次运行成功。
下一节是下载视频流。