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 框架中的一个方法,用于在对象的生命周期结束时安全地删除对象
}
相关推荐
apcipot_rain4 分钟前
【天梯赛】2026天梯赛模拟赛——题解
开发语言·c++·算法·蓝桥杯·天梯赛
-To be number.wan6 分钟前
重新认识一下“私有继承”
c++·学习
Rust研习社7 分钟前
Rust 堆内存指针 Box 详解
开发语言·后端·rust
liulilittle15 分钟前
Lua 浮点数比较
开发语言·junit·lua
yuyuyuliang0026 分钟前
python笔记1
开发语言·笔记·python
摇滚侠27 分钟前
Groovy 如何给集合中添加元素
java·开发语言·windows·python
~plus~28 分钟前
C# 事件溯源与 CQRS 架构:用 EventStoreDB 打造可靠系统
开发语言·架构·c#
江奖蒋犟31 分钟前
【C++】红黑树
开发语言·c++
lclin_202031 分钟前
【大恒相机】C++ 设备枚举+打开关闭+启停采集(基础入门)
c++·工业相机·大恒相机·galaxysdk
雒珣33 分钟前
Qt实现命令行参数功能示例:QCommandLineParser
开发语言·数据库·qt