qt6 获取百度地图(一)

需求分析:

要获取一个地图,

需要ip

需要根据ip查询经纬度

根据经纬度查询地图

另外一条线是根据输入的地址 查询ip 根据查询到的ip查地图‘

最后,要渲染地图

上面这这些动作,要进行http查询:

为此要有三个QNetworkAccessManager对象:

    QNetworkAccessManager *m_ipManager;  // 用于ip管理
    QNetworkAccessManager *m_locManager;   // 用于查询位置
    //网络管理对象  发送地图图片
    QNetworkAccessManager *m_mapManager;   //查询地图
    //响应对象 接收地图图片
    QNetworkReply *m_mapReply=NULL;   //响应

所有的查询动作当然能顺序执行:

如先查询ip

    等待获取IP返回结果

         如果IP返回了,发起根据IP查询经纬度的请求

                等待经纬度查询结果,如果获得的返回,则进一步根据返回的经纬度查询地图数据

                         等待地图数据查询结果,把结果写入文件

                                  从文件中读取数据,渲染到weigt上

但是 如果其中某个环节网络断了 或者百度服务器宕机了,系统就会卡死。

按上面步骤,网络请求是同步顺序,执行来的,用户界面可能会阻塞,用户体验欠佳。

为此我们引入槽函数机制!让网络请求是异步进行,用户界面不会阻塞,这提供了更好的用户体验!

在构造函数中,添加如下代码:

Form1::Form1(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Form1)
{
    ui->setupUi(this);
    //new一个网络管理对象
    m_ipManager = new QNetworkAccessManager(this);  //  net connection tool ,duty is to connect to the server
    //declare  connect relationship ,when receive the response ,call the slot function,response is finished signal
    connect(m_ipManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onGetIp(QNetworkReply*)));

    m_locManager=new QNetworkAccessManager(this);  //net connection tool ,duty is to connect to the server for location
    //declare  connect relationship ,when receive the response ,call the slot function,response is finished signal
    connect(m_locManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onGetCurrentLoc(QNetworkReply*)));

    m_mapManager=new QNetworkAccessManager(this);   //net connection tool ,duty is to connect to the server for map query map
    connect(m_mapManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onSendMapRequest()));
}

和上面connect函数配套的也有三个槽函数,当网络请求有响应的时候,执行响应的槽函数。

配套的三个槽函数,在头文件中 declare如下图:

private slots:
  

    //处理获取外网ip请求的 槽
    void onGetIp(QNetworkReply*);
    //根据ip获取经纬度  处理服务器响应内容
    void onGetCurrentLoc(QNetworkReply*);
    //处理服务器返回地图图片
    void onSendMapRequest();

这样,所有网络查询与处理事异步进行的。

让我们从查询Ip地址起步:

首先通过QNetworkAccessManager 一个实例对象 m_ipManager发起一个request请求。

void Form1::getIp()
{
  // by m_ipManager query ip
    QUrl url("http://httpbin.org/ip");  //declare the url
    QNetworkRequest request(url);  //declare the request
    m_ipManager->get(request);   //send the request
}

这个请求的响应?

嗯嗯,当然在槽函数当中了~~~ 窗体的构造函数中不是“声明”了一个“连接”吗

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值