前言:
在写一个天气预报模块时,需要一个定位功能,在网上翻来翻去才找着,放在这里留着回顾下,也帮下有需要的人
一开始我想着直接调用百度地图的API来定位,
然后我就想先获取本机IP的方式,然后调用百度地图的api来进行对位,结果怎么弄都只能获取到私有IP,私有IP是没法用来定位,但还是具体代码还是贴在这下:
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数组的内容很少
#include <QObject.h> class location{ public: location(){ ip=""; pro=""; proCode=""; city="http://www.devze.com"; cityCode=0; } QString ip; QString pro; QString proCode; QString city; QString cityCode; };
http请求,
在头文件定义两个变量,还有需要用的到函数:
protected: //解析本机外网IP,并获取所在市 void locationInfo(); private slots: //处理定位API请求 void onLocationInfoReceived(QNetworkReply *reply); private: //定位数据 location mlocation; //定位用的API的请求 QNetworkAccessManager* mLocationManger;
放在在构造函数:
//定位请求 mLocationManger=new QNetworkAccessManager(this); connect(mLocationManger,&QNetworkAccessManager::finished,this,&MainWindow::onLocationInfoReceived); locationInfo();
void MainWindow::locationInfo() { QUrl url("http://whois.pconline.com.cn/ipJson.jsp?js编程on=true"); mLocationManger->get(QNetworkRequest(url)); } void MainWindow::onLocationInfoReceived(QNetworkReply *reply) { if (reply->error() == QNetworkReply::NoError) { QString data = QString::fromLocal8Bit(reply->readAll()); QJsonDocument jsonDocument = QJsonDocument::fromJsjavascripton(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 框架中的一个方法,用于在对象的生命周期结束时安全地删除对象 }
到此这篇关于使用Qt实现获取本机IP和定位的文章就介绍到这了,更多相关Qt获取本机IP和定位内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.cppcwww.devze.comns.com)!
精彩评论