网站首页 > 技术文章 正文
界面基本差不多了,现在我们来做实质功能。
首先,我们要将视频网址发到我们的解析程序上,我用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,保存,编译,成功。
粘贴一个网址,然后点击下载进行解析,一次运行成功。
下一节是下载视频流。
猜你喜欢
- 2024-10-24 QT(17)- QNetworkAccessManager qnetworkinterface.allinterfaces
- 2024-10-24 Qt多线程的三种方法QThread qt多线程直接处理数据
- 2024-10-24 从零开始学Qt(86):TCP服务器端程序设计
- 2024-10-24 Qt Core学习日记——第九天QObjectData
- 2024-10-24 Qt智能指针--QSharedPointer qt智能指针.get和.data函数后计数会加吗
- 2024-10-24 QT(11)- QThread qt ui thread work thread
- 2024-10-24 Qt QVariant的用法 qt基本语法
- 2024-10-24 Qt5中QOverload的用法 qt5coredll
- 2024-10-24 Qt多线程编程之QThread qt中的多线程
- 2024-10-24 Qt QModbusReply类 qty是什么单位的缩写
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)