当前位置:   article > 正文

qt6 通过http查询天气的实现_qt6 天气预报

qt6 天气预报

步骤如下: 

  1. cmakelist 当中,增加如下配置
  2.  引入包
  3.  访问远端api
  4.  解析返回的数据

  1. cmakelist 当中,增加如下配置,作用是引入Network库。
    1.  引入包

 3、访问远端api

  1. void Form1::on_pushButton_clicked()
  2. {
  3. //根据URL(http://t.weather.itboy.net/api/weather/city/101010100)http请求查询温度信息
  4. QNetworkAccessManager *manager = new QNetworkAccessManager(this); //网络管理器
  5. QNetworkRequest request; //请求
  6. request.setUrl(QUrl("http://t.weather.itboy.net/api/weather/city/101010100")); //设置url
  7. QNetworkReply *reply = manager->get(request); //发送get请求
  8. connect(reply, &QNetworkReply::finished, [=](){ //请求完成后的处理
  9. if(reply->error() == QNetworkReply::NoError)
  10. {
  11. QByteArray data = reply->readAll();
  12. QJsonParseError json_error;
  13. QJsonDocument doc = QJsonDocument::fromJson(data, &json_error); //解析json数据
  14. if(json_error.error == QJsonParseError::NoError)
  15. {
  16. if(doc.isObject())
  17. {
  18. QJsonObject obj = doc.object(); //获取json对象
  19. if(obj.contains("data")) //判断是否包含data
  20. {
  21. QJsonValue value = obj.value("data"); //获取data数据
  22. if(value.isObject())
  23. {
  24. QJsonObject data = value.toObject(); //获取data对象
  25. if(data.contains("wendu")) //判断是否包含wendu
  26. {
  27. QJsonValue wendu = data.value("wendu"); //获取温度
  28. ui->label->setText("温度:" + wendu.toString()); //显示温度
  29. }
  30. }
  31. }
  32. }
  33. }
  34. }
  35. reply->deleteLater(); //释放资源 这个很重要!!!
  36. });
  37. }

这段代码是在Qt框架中,特别是使用Qt Network模块,来实现一个HTTP GET请求以查询指定城市的天气温度信息。这里详细解释每一步的作用和目的:

  1. 创建QNetworkAccessManager实例

  2. QNetworkAccessManager *manager = new QNetworkAccessManager(this);

    QNetworkAccessManager是Qt中用于发送网络请求的类。这里创建了一个QNetworkAccessManager的实例,并将this(假设是某个QWidget或QObject的子类,如Form1)作为父对象。这样做可以确保当Form1被销毁时,QNetworkAccessManager也会被正确地销毁。

  3. 设置请求

    1. QNetworkRequest request;
    2. request.setUrl(QUrl("http://t.weather.itboy.net/api/weather/city/101010100"));

    创建一个QNetworkRequest对象并设置其URL为需要查询的天气API的URL。这里假设URL是正确的,并且服务器会返回JSON格式的天气数据。

  4. 发送GET请求

  5. QNetworkReply *reply = manager->get(request);

    通过QNetworkAccessManagerget方法发送GET请求。这个方法返回一个QNetworkReply对象的指针,该对象将用于后续处理HTTP响应

  6. 处理响应
    使用connect函数将QNetworkReplyfinished信号连接到一个lambda表达式,该表达式在请求完成时执行。

    • 检查错误:首先检查响应中是否有错误。如果没有错误(QNetworkReply::NoError),则继续处理数据。
    • 读取并解析JSON数据:使用readAll方法读取响应数据,然后尝试使用QJsonDocument::fromJson方法解析这些数据为QJsonDocument对象。解析过程中,QJsonParseError对象用于捕获任何可能的解析错误。
    • 遍历JSON对象:解析成功后,检查JSON文档是否是一个对象,并遍历它以查找包含温度信息的data字段。如果找到data字段,并且它是一个对象,则进一步查找wendu(温度)字段。
    • 显示温度:如果找到wendu字段,将其值转换为字符串,并设置到UI的某个标签(假设为ui->label)上。
  7. 资源释放

  8. reply->deleteLater();

    在lambda表达式的末尾调用deleteLater方法。这是为了确保在lambda表达式执行完毕后,QNetworkReply对象能够被正确地删除。这是因为QNetworkReply对象在响应完成后仍然占用内存,直接删除可能会导致问题,而deleteLater会将其放入事件循环中稍后删除。

注意

  • 我们图形化界面中 ui->label
  • 这段代码API返回的数据格式是已知的,
  1. {
  2. "message": "success感谢又拍云(upyun.com)提供CDN赞助",
  3. "status": 200,
  4. "date": "20240703",
  5. "time": "2024-07-03 19:15:24",
  6. "cityInfo": {
  7. "city": "北京市",
  8. "citykey": "101010100",
  9. "parent": "北京",
  10. "updateTime": "15:46"
  11. },
  12. "data": {
  13. "shidu": "51%",
  14. "pm25": 31.0,
  15. "pm10": 42.0,
  16. "quality": "优",
  17. "wendu": "28.6",
  18. "ganmao": "各类人群可自由活动",
  19. "forecast": [
  20. {
  21. "date": "03",
  22. "high": "高温 31℃",
  23. "low": "低温 17℃",
  24. "ymd": "2024-07-03",
  25. "week": "星期三",
  26. "sunrise": "04:50",
  27. "sunset": "19:46",
  28. "aqi": 67,
  29. "fx": "南风",
  30. "fl": "2级",
  31. "type": "晴",
  32. "notice": "愿你拥有比阳光明媚的心情"
  33. },
  34. {
  35. "date": "04",
  36. "high": "高温 30℃",
  37. "low": "低温 21℃",
  38. "ymd": "2024-07-04",
  39. "week": "星期四",
  40. "sunrise": "04:51",
  41. "sunset": "19:46",
  42. "aqi": 85,
  43. "fx": "东南风",
  44. "fl": "2级",
  45. "type": "小雨",
  46. "notice": "雨虽小,注意保暖别感冒"
  47. },
  48. {
  49. "date": "05",
  50. "high": "高温 32℃",
  51. "low": "低温 22℃",
  52. "ymd": "2024-07-05",
  53. "week": "星期五",
  54. "sunrise": "04:51",
  55. "sunset": "19:46",
  56. "aqi": 94,
  57. "fx": "西南风",
  58. "fl": "2级",
  59. "type": "多云",
  60. "notice": "阴晴之间,谨防紫外线侵扰"
  61. },
  62. {
  63. "date": "06",
  64. "high": "高温 29℃",
  65. "low": "低温 23℃",
  66. "ymd": "2024-07-06",
  67. "week": "星期六",
  68. "sunrise": "04:52",
  69. "sunset": "19:45",
  70. "aqi": 84,
  71. "fx": "东北风",
  72. "fl": "2级",
  73. "type": "小雨",
  74. "notice": "雨虽小,注意保暖别感冒"
  75. },
  76. {
  77. "date": "07",
  78. "high": "高温 32℃",
  79. "low": "低温 23℃",
  80. "ymd": "2024-07-07",
  81. "week": "星期日",
  82. "sunrise": "04:53",
  83. "sunset": "19:45",
  84. "aqi": 84,
  85. "fx": "南风",
  86. "fl": "2级",
  87. "type": "阴",
  88. "notice": "不要被阴云遮挡住好心情"
  89. },
  90. {
  91. "date": "08",
  92. "high": "高温 35℃",
  93. "low": "低温 23℃",
  94. "ymd": "2024-07-08",
  95. "week": "星期一",
  96. "sunrise": "04:53",
  97. "sunset": "19:45",
  98. "aqi": 77,
  99. "fx": "西南风",
  100. "fl": "2级",
  101. "type": "晴",
  102. "notice": "愿你拥有比阳光明媚的心情"
  103. },
  104. {
  105. "date": "09",
  106. "high": "高温 34℃",
  107. "low": "低温 24℃",
  108. "ymd": "2024-07-09",
  109. "week": "星期二",
  110. "sunrise": "04:54",
  111. "sunset": "19:44",
  112. "aqi": 62,
  113. "fx": "东南风",
  114. "fl": "1级",
  115. "type": "大雨",
  116. "notice": "出门最好穿雨衣,勿挡视线"
  117. },
  118. {
  119. "date": "10",
  120. "high": "高温 34℃",
  121. "low": "低温 25℃",
  122. "ymd": "2024-07-10",
  123. "week": "星期三",
  124. "sunrise": "04:55",
  125. "sunset": "19:44",
  126. "aqi": 61,
  127. "fx": "东北风",
  128. "fl": "2级",
  129. "type": "小雨",
  130. "notice": "雨虽小,注意保暖别感冒"
  131. },
  132. {
  133. "date": "11",
  134. "high": "高温 34℃",
  135. "low": "低温 26℃",
  136. "ymd": "2024-07-11",
  137. "week": "星期四",
  138. "sunrise": "04:55",
  139. "sunset": "19:44",
  140. "aqi": 58,
  141. "fx": "东南风",
  142. "fl": "2级",
  143. "type": "多云",
  144. "notice": "阴晴之间,谨防紫外线侵扰"
  145. },
  146. {
  147. "date": "12",
  148. "high": "高温 30℃",
  149. "low": "低温 25℃",
  150. "ymd": "2024-07-12",
  151. "week": "星期五",
  152. "sunrise": "04:56",
  153. "sunset": "19:43",
  154. "aqi": 63,
  155. "fx": "东南风",
  156. "fl": "2级",
  157. "type": "阴",
  158. "notice": "不要被阴云遮挡住好心情"
  159. },
  160. {
  161. "date": "13",
  162. "high": "高温 35℃",
  163. "low": "低温 25℃",
  164. "ymd": "2024-07-13",
  165. "week": "星期六",
  166. "sunrise": "04:57",
  167. "sunset": "19:43",
  168. "aqi": 47,
  169. "fx": "东南风",
  170. "fl": "2级",
  171. "type": "阴",
  172. "notice": "不要被阴云遮挡住好心情"
  173. },
  174. {
  175. "date": "14",
  176. "high": "高温 35℃",
  177. "low": "低温 25℃",
  178. "ymd": "2024-07-14",
  179. "week": "星期日",
  180. "sunrise": "04:57",
  181. "sunset": "19:42",
  182. "aqi": 66,
  183. "fx": "东南风",
  184. "fl": "2级",
  185. "type": "多云",
  186. "notice": "阴晴之间,谨防紫外线侵扰"
  187. },
  188. {
  189. "date": "15",
  190. "high": "高温 32℃",
  191. "low": "低温 23℃",
  192. "ymd": "2024-07-15",
  193. "week": "星期一",
  194. "sunrise": "04:58",
  195. "sunset": "19:42",
  196. "aqi": 61,
  197. "fx": "东风",
  198. "fl": "2级",
  199. "type": "中雨",
  200. "notice": "记得随身携带雨伞哦"
  201. },
  202. {
  203. "date": "16",
  204. "high": "高温 30℃",
  205. "low": "低温 21℃",
  206. "ymd": "2024-07-16",
  207. "week": "星期二",
  208. "sunrise": "04:59",
  209. "sunset": "19:41",
  210. "aqi": 54,
  211. "fx": "东风",
  212. "fl": "2级",
  213. "type": "中雨",
  214. "notice": "记得随身携带雨伞哦"
  215. },
  216. {
  217. "date": "17",
  218. "high": "高温 35℃",
  219. "low": "低温 23℃",
  220. "ymd": "2024-07-17",
  221. "week": "星期三",
  222. "sunrise": "05:00",
  223. "sunset": "19:40",
  224. "aqi": 46,
  225. "fx": "西南风",
  226. "fl": "2级",
  227. "type": "多云",
  228. "notice": "阴晴之间,谨防紫外线侵扰"
  229. }
  230. ],
  231. "yesterday": {
  232. "date": "02",
  233. "high": "高温 25℃",
  234. "low": "低温 17℃",
  235. "ymd": "2024-07-02",
  236. "week": "星期二",
  237. "sunrise": "04:50",
  238. "sunset": "19:46",
  239. "aqi": 25,
  240. "fx": "北风",
  241. "fl": "2级",
  242. "type": "小雨",
  243. "notice": "雨虽小,注意保暖别感冒"
  244. }
  245. }
  246. }
  • 由于网络请求是异步的,用户界面不会阻塞,这提供了更好的用户体验。槽函数在这里功不可没!另外 感谢哈工程大学通讯专业的同学,上面代码不是我写的:)

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号