使用Qt实现获取本机IP和定位

 更新时间:2024年11月07日 09:41:53   作者:fengbizhe  
这篇文章主要为大家详细介绍了如何使用Qt实现获取本机IP和定位,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

前言:

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

一开始我想着直接调用百度地图的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="";
        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?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 框架中的一个方法,用于在对象的生命周期结束时安全地删除对象
}

到此这篇关于使用Qt实现获取本机IP和定位的文章就介绍到这了,更多相关Qt获取本机IP和定位内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ pair的用法实例详解

    C++ pair的用法实例详解

    这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 解决VC++编译报错error C2248的方案

    解决VC++编译报错error C2248的方案

    这篇文章主要介绍了解决VC++编译报错error C2248的方案的相关资料,需要的朋友可以参考下
    2015-11-11
  • 浅谈c语言中类型隐性转换的坑

    浅谈c语言中类型隐性转换的坑

    下面小编就为大家带来一篇浅谈c语言中类型隐性转换的坑。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • C语言实现随机抽取纸牌程序

    C语言实现随机抽取纸牌程序

    这篇文章主要为大家详细介绍了C语言实现随机抽取纸牌程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++ 中国象棋的实现流程详解

    C++ 中国象棋的实现流程详解

    中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动
    2021-11-11
  • C++实现学生成绩管理系统最新版

    C++实现学生成绩管理系统最新版

    这篇文章主要为大家详细介绍了C++实现学生成绩管理系统最新版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++实现LeetCode(27.移除元素)

    C++实现LeetCode(27.移除元素)

    这篇文章主要介绍了C++实现LeetCode(27.移除元素),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ 将文件数据一次性加载进内存实例代码

    C++ 将文件数据一次性加载进内存实例代码

    这篇文章主要介绍了C++ 将文件数据一次性加载进内存实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • C语言实现打印数字金字塔

    C语言实现打印数字金字塔

    这篇文章主要介绍了C语言实现打印数字金字塔方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言复数的加减及输出结构体

    C语言复数的加减及输出结构体

    大家好,本篇文章主要讲的是C语言复数的加减及输出结构体,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02

最新评论