qt获取本机IP和定位

前言:

在写一个天气预报模块时,需要一个定位功能,在网上翻来翻去才找着,放在这里留着回顾下,也帮下有需要的人

正文:

  1. 一开始我想着直接调用百度地图的API来定位,

  2. 然后我就想先获取本机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";
}
  1. 重点来了,我找到了一个可以获取公有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 框架中的一个方法,用于在对象的生命周期结束时安全地删除对象
}
相关推荐
search7几秒前
C 学习(5)
c语言·c++
孤邑6 分钟前
【C++】C++四种类型转换方式
开发语言·c++·笔记·学习·1024程序员节
Source.Liu15 分钟前
【用Rust写CAD】前言
开发语言·rust
jzlhll12316 分钟前
kotlin android Handler removeCallbacks runnable不生效的一种可能
android·开发语言·kotlin
&岁月不待人&18 分钟前
Kotlin 协程使用及其详解
开发语言·kotlin
苏柘_level619 分钟前
【Kotlin】 基础语法笔记
开发语言·笔记·kotlin
m0_6299583423 分钟前
TCP编程-socket(套接字)编程实战1
网络·网络协议·tcp/ip
C++忠实粉丝42 分钟前
Linux系统基础-多线程超详细讲解(5)_单例模式与线程池
linux·运维·服务器·c++·算法·单例模式·职场和发展
2401_877158731 小时前
什么是垃圾回收(Garbage Collection)?
java·开发语言·算法
Gavin_9151 小时前
【JavaScript】数组-集合-Map-对象-Class用法一览
开发语言·前端·javascript