首先,我们要将视频网址发到我们的解析程序上,我用PHP做了一个解析程序,放到了网上。以是我要让QT用post的办法将我们要解析的网址发送过去,然后网上的解析程序把解析完的下载网址再用json格式反回来给我们的QT程序,这样我们就能下载了。
这便是本节要搞的重点,经由搜索,QT中访问http网址要用这两个类:
QNetworkAccessManagerQNetworkRequest
第一个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,保存,编译,成功。
粘贴一个网址,然后点击下载进行解析,一次运行成功。
得到json数据
下一节是下载视频流。