基于 Qt / HTTP/JSON 的智能天氣預報系統測試報告

目錄

一、項目概述

1.1項目背景

1.2項目目標

二、功能需求

2.1 用戶界面功能

2.2 后臺功能

三、技術選擇

3.1 開發框架與工具

3.2 第三方 API

四、UI設計

4.1界面展示

4.2stylesheet樣式

五、代碼實現

1.構造函數

2.網絡請求響應處理函數

3.處理json數據

4.更新UI數據

5.城市搜索按鈕實現

6.鼠標左鍵拖動窗口移動右鍵關閉

7.事件過濾器繪圖

?六、結果測試


一、項目概述

1.1項目背景

????????隨著人們對生活品質要求的提高,天氣預報已成為日常生活的重要組成部分。通過準確的天氣信息,用戶可以更好地規劃出行、穿衣等日常活動。本項目旨在開發一個基于 Qt 框架的天氣預報系統,實現實時天氣數據的獲取、展示以及歷史天氣數據的查詢功能。

1.2項目目標

  • 實現天氣數據的 HTTP 請求與解析。

  • 展示實時天氣信息(包括溫度、濕度、風速、空氣質量等)。

  • 提供未來 7 天天氣預報功能。

  • 提供用戶友好的圖形界面。

二、功能需求

2.1 用戶界面功能

  • 實時天氣顯示:包括當前溫度、濕度、風速、天氣狀況等。

  • 未來天氣預報

    • 24 小時天氣預報(每小時)。

    • 7 天天氣預報。

  • 城市切換:用戶可以選擇不同的城市查看天氣信息。

2.2 后臺功能

  • HTTP 請求接口實現,用于獲取天氣數據。

  • JSON 數據解析模塊,將接收到的 JSON 格式天氣數據轉換為程序可用的數據結構。

三、技術選擇

3.1 開發框架與工具

  • Qt 框架:用于 GUI 界面開發和應用程序邏輯實現。

  • QNetworkAccessManager:用于 HTTP 請求(API 調用)。

  • JSON 解析庫:使用 Qt 提供的?QJsonDocument?類解析天氣數據。

3.2 第三方 API

  • 使用天氣預報服務提供商的 API(如 OpenWeatherMap、WeatherStack 等),實現天氣數據接口調用。

易客云天氣API免費天氣API接口|天氣預報接口|全球天氣API接口|氣象預警|空氣質量我直接使用了這個網站提供的接口。

四、UI設計

4.1界面展示

將整個界面分為四部分,命名如對應部分所示,在控件比較多的情況下,注意排版技巧,分模塊會更清晰一些,對控件的命名要規律,在后面功能實現的時候編寫代碼會更順。

4.2stylesheet樣式

設置邊框弧度:

border-radius: 4px;

?設置某方向邊框弧度:

border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;

?設置背景顏色:

background-color: rgba(60, 60, 60, 100);

父控件影響:
?

QLabel {
background-color: rgba(0, 200, 200, 200);
border-radius: 4px;
}

五、代碼實現

1.構造函數

使用Qt框架創建了一個無邊框窗口,固定大小為411x850像素,并設置Arial字體大小為15。創建了一個包含“退出”操作的下拉菜單。點擊該菜單項會觸發關閉當前窗口的操作。使用QNetworkAccessManager發送HTTP GET請求到指定天氣API接口,以獲取實時天氣數據。定義了處理網絡響應的槽函數readHttpReply,當網絡請求完成時將調用該函數來處理返回的數據。

2.網絡請求響應處理函數

  1. 獲取并打印HTTP狀態碼:從QNetworkReply對象中提取HTTP狀態碼,并將其輸出到調試控制臺。這有助于在開發和調試過程中快速判斷網絡請求的成功與否。

  2. 檢查網絡請求是否成功:使用reply->error()方法檢查是否存在網絡錯誤,同時驗證HTTP狀態碼是否為200(表示成功的響應)。如果這兩個條件都滿足,則認為請求是成功的。

  3. 處理成功的網絡響應:讀取所有來自服務器的響應數據,并將其傳遞給新的解析函數parseWeatherJsonDataNew(data);。這表明代碼中有專門的函數來解析JSON格式的數據,以便提取有用的信息(如天氣數據)進行后續處理或顯示。

  4. 處理失敗的網絡響應:如果網絡請求出現錯誤(如連接超時、服務器不可達等),則創建并顯示一個警告對話框。該對話框提示用戶請求失敗,并且按鈕的文字顏色被設置為紅色以增強視覺效果。

3.處理json數據

4.更新UI數據

void Widget::updateUI()
{ui->labelCurrentData->setText(days[0].mDate+" "+days[0].mWeek);//解析城市名稱ui->labelCity->setText(days[0].mCity+"市");//解析當前溫度ui->labelTemp->setText(days[0].mTemp+"°");ui->labelTempRange->setText(days[0].mTempLow+"℃"+"~"+days[0].mTempHigh+"℃");//解析天氣類型ui->labelweatherType->setText(days[0].mWeathType);ui->labelWeatherIcon->setPixmap(mTypeMap[days[0].mWeathType]);//感冒指數ui->labelGanmao->setText(days[0].mTips);//風向ui->labelFXType->setText(days[0].mFx);//風力ui->labelFXType_3->setText(days[0].mFl);//PM2.5ui->labelPM25Data->setText(days[0].mPm25);//濕度ui->labelShiduData->setText(days[0].mHu);//空氣質量ui->labelairData->setText(days[0].mAirq);for(int i=0;i<6;i++){mWeekList[i]->setText(days[i].mWeek);mWeekList[0]->setText("今天");mWeekList[1]->setText("明天");mWeekList[2]->setText("后天");QStringList dayList = days[i].mDate.split("-");mDateList[i]->setText(dayList.at(1)+"-"+dayList.at(2));int index = days[i].mWeathType.indexOf("轉");
//        if(index!=-1){
//            qDebug()<<days[i].mWeathType.left(index);
//            mIconList[i]->setPixmap(mTypeMap[days[i].mWeathType.left(index)]);
//            mWeaTypeList[i]->setText(days[i].mWeathType.left(index));
//        }mIconList[i]->setPixmap(mTypeMap[days[i].mWeathType]);mWeaTypeList[i]->setText(days[i].mWeathType);QString airQ = days[i].mAirq;mAirqList[i]->setText(airQ);if(airQ=="優"){mAirqList[i]->setStyleSheet("background-color : rgb(150,213,32);border-radius: 7px;");}if(airQ=="良"){mAirqList[i]->setStyleSheet("background-color : rgb(241,224,103);border-radius: 7px;");}if(airQ=="輕度污染"){mAirqList[i]->setStyleSheet("background-color : rgb(255,199,199);border-radius: 7px;");}if(airQ=="中度污染"){mAirqList[i]->setStyleSheet("background-color : rgb(255,17,17);border-radius: 7px;");}if(airQ=="重度污染"){mAirqList[i]->setStyleSheet("background-color : rgb(153,0,0);border-radius: 7px;");}mFxList[i]->setText(days[i].mFx);index = days[i].mFl.indexOf("轉");if(index!=-1){mFlList[i]->setText(days[i].mFl.left(index));}else{mFlList[i]->setText(days[i].mFl);}}update();}

5.城市搜索按鈕實現

6.鼠標左鍵拖動窗口移動右鍵關閉

7.事件過濾器繪圖

?六、結果測試

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75922.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75922.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GitLab 中文版17.10正式發布,27項重點功能解讀【三】

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

DPO介紹+公式推理

1. 什么是DPO&#xff1f; DPO&#xff08;Direct Preference Optimization&#xff09;是一種用于對齊大語言模型&#xff08;LLMs&#xff09;的新型方法&#xff0c;旨在高效地將人類偏好融入模型訓練中。它提供了一種替代強化學習&#xff08;如 RLHF, Reinforcement Learn…

C語言基礎—構造類型

數據類型 1.基本類型/基礎類型 整型 短整型&#xff1a;short[int] --2字節 基本整型&#xff1a;int --4字節 長整型&#xff1a;long[int] --32位4字節/64位8字節 長長整型&#xff1a;long long [int] &#xff08;C99&#xff09; 注意&#xff1a;以上類型又都分為sig…

2025年高壓電工考試真題分享

以下是一些高壓電工考試題&#xff1a; 單選題 1、高壓架空線路的檔距一般為&#xff08; &#xff09;。 A. 20 - 30m B. 30 - 50m C. 50 - 80m D. 80 - 100m 答案&#xff1a;B。解析&#xff1a;高壓架空線路檔距一般在 30 - 50m&#xff0c;這樣的檔距能較好地保證線…

什么是SQL作業

SQL作業是在數據庫服務器上按特定時間或間隔自動執行的計劃任務或流程&#xff0c;這些作業由Microsoft SQL Server中的SQL Server代理管理&#xff0c;對于自動執行日常任務&#xff08;如數據庫系統中的備份、數據導入和報告生成&#xff09;以及確保及時準確地處理和更新數據…

【數據分享】基于聯合國城市化程度框架的全球城市邊界數據集(免費獲取/Shp格式)

在全球城市化進程不斷加快的今天&#xff0c;如何精準定義和測量“城市”成為關鍵問題。不同國家和機構采用不同的標準&#xff0c;導致全球城市化水平的統計結果存在較大差異。同時&#xff0c;由于數據來源分散、標準不統一&#xff0c;獲取一套完整、可比的全球城市邊界數據…

劉火良FreeRTOS內核實現與應用學習之6——多優先級

在FreeRTOS中&#xff0c;數字優先級越小&#xff0c;邏輯優先級也越小&#xff1b;在任務創建時&#xff0c;會根據任務的優先級將任務插入就緒列表不同的位置。 List_t pxReadyTasksLists[ configMAX_PRIORITIES ] 就緒列表是一個數組&#xff0c;數組中存儲的是就緒任務TCB(…

生成信息提取的大型語言模型綜述

摘要 信息提取&#xff08;IE&#xff09;旨在從簡單的自然語言文本中提取結構知識。最近&#xff0c;生成型大型語言模型&#xff08;LLMs&#xff09;在文本理解和生成方面表現出了顯著的能力。因此&#xff0c;已經提出了許多基于生成范式將LLM集成到IE任務中的工作。為了對…

簡單談談很火的MCP( Model Context Protocol,模型上下文協議)

MCP( Model Context Protocol&#xff0c;模型上下文協議)是由Anthropic推出的開放協議&#xff0c;并非獨立的大模型&#xff0c;而是連接大模型與外部工具/數據源的標準化接口?&#xff0c;旨在解決AI工具開發中接口不統一、跨模型共享困難等問題。? 一、工作原理 MCP 協…

解決linux centos ubuntu等無法啟動谷歌chrome瀏覽器問題

命令啟動chrome時候提示&#xff1a; Running as root without --no-sandbox is not supported. See https://crbug.com/638180. 解決無法啟動谷歌chrome瀏覽器&#xff1a; cd /usr/bin 發現目錄下有 google-chrome google-chrome-stable 執行&#xff1a; vim go…

深入解析緩沖區:計算機世界的“蓄水池”與“加速器”

引言 想象這樣一個場景&#xff1a; 你的手機正在播放4K視頻&#xff0c;同時下載大型文件 視頻畫面流暢無卡頓&#xff0c;下載速度穩定在滿帶寬 但手機的內存只有8GB&#xff0c;下載文件的大小卻超過20GB 這看似矛盾的現象背后&#xff0c;緩沖區&#xff08;Buffer&am…

網絡故障診斷

一 網絡故障診斷的方法 1 試錯法&#xff1a;通過推測提出解決方案&#xff0c;最后得出故障原因的方法。 2 參照法&#xff1a;是一種比較快速解決網絡故障的方法&#xff0c;只有當故障設備與正常工作設備具有相近的條件時&#xff0c;才可以使用參照法。 3 替換法&#xff1…

界面控件Telerik和Kendo UI 2025 Q1亮點——AI集成與數據可視化

Telerik DevCraft包含一個完整的產品棧來構建您下一個Web、移動和桌面應用程序。它使用HTML和每個.NET平臺的UI庫&#xff0c;加快開發速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于構建現代和面向未來的業務應用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…

ollama遷移已下載的單個模型到服務器

ollama遷移已下載的單個模型到服務器 場景 ollama是面向用戶級的&#xff0c;部署和運行都很簡單&#xff0c;是否高效就另說了。但最起碼&#xff0c;他能充分利用用戶的硬件設備&#xff0c;在GPU不足也能調用cpu和內存去加持。 ollama運行的模型基本是量化版本的&#xf…

怎么對asp.web api進行單元測試?

在 ASP.NET Web API 中進行單元測試是一種確保代碼質量和功能正確性的重要實踐。單元測試的重點是針對 API 控制器中的邏輯進行測試&#xff0c;而不依賴于外部依賴&#xff08;如數據庫、文件系統或網絡請求&#xff09;。以下是實現 ASP.NET Web API 單元測試的步驟和方法&am…

UDP視頻傳輸中的丟包和播放花屏處理方法

在處理UDP視頻傳輸中的丟包和花屏問題時,需要結合編碼優化、網絡傳輸策略和接收端糾錯技術。以下是分步驟的解決方案: 1. 前向糾錯(FEC,Forward Error Correction) 原理:在發送數據時附加冗余包,接收方通過冗余信息恢復丟失的數據包。 實現方法: 使用Reed-Solomon、XO…

WebGL圖形編程實戰【3】:矩陣操控 × 從二維到三維的跨越

上一篇文章&#xff1a;WebGL圖形編程實戰【2】&#xff1a;動態著色 紋理貼圖技術揭秘 倉庫地址&#xff1a;github…、gitee… 矩陣操控 矩陣變換 回到前面關于平移縮放、旋轉的例子當中&#xff0c;我們是通過改變傳遞進去的xy的值來改變的。 在進行基礎變換的時候&…

并發編程--共享內存SHM

共享內存SHM 文章目錄 共享內存SHM1. 基本概念2. 函數接口2.1 創建或打開SHM對象2.2 映射 / 解除映射SHM對象2.3 其余操作2.4示例代碼 1. 基本概念 共享內存&#xff0c;顧名思義&#xff0c;就是通過不同進程共享一段相同的內存來達到通信的目的&#xff0c;由于SHM對象不再交…

Redis中的數據類型與適用場景

目錄 前言1. 字符串 (String)1.1 特點1.2 適用場景 2. 哈希 (Hash)2.1 特點2.2 適用場景 3. 列表 (List)3.1 特點3.2 適用場景 4. 集合 (Set)4.1 特點4.2 適用場景 5. 有序集合 (Sorted Set)5.1 特點5.2 適用場景 6. Redis 數據類型的選型建議結語 前言 Redis 作為一款高性能的…

科技賦能建筑業變革:中建海龍創新引領高質量發展新路徑

在建筑工業化浪潮中&#xff0c;中建海龍科技有限公司&#xff08;以下簡稱“中建海龍”&#xff09;憑借深厚的技術積累與持續創新&#xff0c;成為推動行業轉型升級的標桿企業。作為中國建筑國際集團旗下核心科技力量&#xff0c;中建海龍深耕模塊化集成建筑&#xff08;MiC&…