前言:
在写一个天气预报模块时,需要一个定位功能,在网上翻来翻去才找着,放在这里留着回顾下,也帮下有需要的人
正文:
-
一开始我想着直接调用百度地图的API来定位,
-
然后我就想先获取本机IP的方式,然后调用百度地图的api来进行对位,结果怎么弄都只能获取到私有IP,私有IP是没法用来定位,但还是具体代码还是贴在这下:
cpp
QString MainWindow::getIP()//返回一个IP地址,但是是私有的
{
QList<QHostAddress> list=QNetworkInterface::allAddresses();
foreach (QHostAddress address, list) {
if(address.protocol()==QAbstractSocket::IPv4Protocol)
return address.toString();
}
return "0.0.0.0";
}
- 重点来了,我找到了一个可以获取公有IP和当前用户所在市的API,http://whois.pconline.com.cn/ipJson.jsp?json=true,调用这个API,就可以了
- 要调用之前,要写一个类去存放(拆解)返回JSON数组,很简单,毕竟这个JSON数组的内容很少
cpp
#include <QObject.h>
class location{
public:
location(){
ip="";
pro="";
proCode="";
city="";
cityCode=0;
}
QString ip;
QString pro;
QString proCode;
QString city;
QString cityCode;
};
- http请求,
在头文件定义两个变量,还有需要用的到函数:
cpp
protected:
//解析本机外网IP,并获取所在市
void locationInfo();
private slots:
//处理定位API请求
void onLocationInfoReceived(QNetworkReply *reply);
private:
//定位数据
location mlocation;
//定位用的API的请求
QNetworkAccessManager* mLocationManger;
放在在构造函数:
cpp
//定位请求
mLocationManger=new QNetworkAccessManager(this);
connect(mLocationManger,&QNetworkAccessManager::finished,this,&MainWindow::onLocationInfoReceived);
locationInfo();
cpp
void MainWindow::locationInfo()
{
QUrl url("http://whois.pconline.com.cn/ipJson.jsp?json=true");
mLocationManger->get(QNetworkRequest(url));
}
void MainWindow::onLocationInfoReceived(QNetworkReply *reply)
{
if (reply->error() == QNetworkReply::NoError) {
QString data = QString::fromLocal8Bit(reply->readAll());
QJsonDocument jsonDocument = QJsonDocument::fromJson(data.toUtf8());
QJsonObject jsonObject = jsonDocument.object();
qDebug()<<"read all:"<<jsonObject;
mlocation.ip = jsonObject.value("ip").toString();
mlocation.pro = jsonObject.value("pro").toString();
mlocation.proCode = jsonObject.value("proCode").toString();
mlocation.city = jsonObject.value("city").toString();
mlocation.cityCode = jsonObject.value("cityCode").toString();
} else {
qDebug() << "Location request error: " << reply->errorString();
}
qDebug()<<mlocation.city;
//请求天气信息
getWeatherInfo(mlocation.city);
reply->deleteLater();//deleteLater 是 Qt 框架中的一个方法,用于在对象的生命周期结束时安全地删除对象
}