我们在浏览器中输入一个网址,然后在网页中就会显示出这个网页中的内容。
试想那在QT应用中如何访问这个网页,并获取到网页数据呢?
从网页中获取数据,需要用到的三个类:
类 | 功能介绍 |
---|---|
QNetworkAccessManager | 用于协调网络操作,每当一个请求创建后,用该类来调度它,并发射信号报告进度。 |
QNetworkRequest | 是一个抽象的类(定义对象的时候要用指针),用来对网页进行请求,作为与请求有关的信息的统一容器,在创建请求对象时,通过指定URL来决定请求的网页(隐藏包含了请求的协议),目前支持HTTP、FTP、本地文件URLs的上传和下载。 |
QNetworkReply | 对于网络请求的应答使用该类;当请求被完成调度时,由QNetworkAccessManager类创建 |
1、程序编写流程
1、通过QNetworkRequest 类,创建一个网络请求对象,并为这个请求设置一个网址。
QNetworkRequest networkRequest(QUrl("http://whois.pconline.com.cn/ipJson.jsp")); //指定请求的网址(可以获取到当前电脑IP地址的归属地),可以在创建对象的时候进行赋值操作
2、通过QNetworkAccessManage 类的get方法,可以将这个网页请求发送给服务器,并接收服务器发送的回复信息。接收完回复信息会释放finished信号。
QNetworkReply networkReply = networkAccessManager->get(networkRequest); //进行网络请求,会返回一个回复,服务器回复结束,QnetworkReply就会释放finished信号
4、对finished信号绑定一个槽函数,并在这个槽函数中,通过QNetworkReply类下的readAll()方法,就可以接收服务器发送回来的全部网页数据了。
connect(networkReply,SIGNAL(finished()),this,SLOT(finished_slot())); //回复结束的时候QnetworkReply会释放finished信号
void Widget::finished_slot()
{
QNetworkReply *reply = (QNetworkReply *) sender();//sender()函数作用就是得到一个指针,这个指针是:当前槽函数所对应的信号是哪个对象发送的
QByteArray data1 = reply->readAll(); //读取传回来的JSON数据
reply->deleteLater(); //记得释放内存
}
注意:如果想把获取到的JSON数据打印出来看看,直接就放在打印语句中是不行的(中文会乱码),需要转化数据的编码形式。因为网页传回来的数据编码形式不是Unicode形式,而QT默认的编码时Unicode形式,所以要转化为Unicode形式后QT才能正确处理。