需求分析:
要获取一个地图,
需要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
}
这个请求的响应?
嗯嗯,当然在槽函数当中了~~~ 窗体的构造函数中不是“声明”了一个“连接”吗