基於Qt的新冠肺炎疫情數據實時監控平台(開源小項目)


宅家無聊,不如學點技術!

1.前言

最近新冠病毒導致的肺炎疫情,很多人都只能宅在家里。為了不讓自己那么無聊,給自己找點事情,做一個“疫情數據信息實時監控項目”,去年開始學習的Qt/C++,拿這個小項目練練手吧。當然如果你也和我一樣,建議你使用熟悉的編程語言自己實現一下,即學習了知識,又打發了時間。在做之前我先去Github上搜索了一下,看看有沒有相關資料,看來已經有很多人在做了:

不過大多都是基於JavaScript或Python的項目,使用Qt/C++平台開發的還沒有。

2.主要功能

界面也很簡單,主要包括實時數據和歷史數據的顯示,實時疫情動態信息的顯示,辟謠信息的展示。數據來自騰訊新聞,UI設計參考了騰訊新聞的界面。

一共使用了兩個數據接口,來自騰訊新聞,一個是包括實時數據、歷史數據和疫情動態的接口,一個是包含辟謠信息的接口。

功能也很簡單:

  • 全國疫情數據實時顯示
  • 歷史疫情數據趨勢折線圖顯示
  • 各省市和海外疫情數據樹形顯示
  • 最新疫情新聞動態顯示
  • 最新辟謠信息展示
  • 手動和自動更新(每5分鍾)

3.獲取數據接口

現在,各大網站都發布了自己的實時疫情顯示平台,如丁香園、騰訊、新浪、百度、知乎、網易等等,包括個人開發者也開發了一些接口,數據都是來自國家或各地衛健委發布的信息。

  • 丁香園: https://ncov.dxy.cn/ncovh5/view/pneumonia
  • 騰訊:https://news.qq.com/zt2020/page/feiyan.htm
  • 新浪:https://news.sina.cn/zt_d/yiqing0121
  • 百度: https://voice.baidu.com/act/newpneumonia/newpneumonia
  • 知乎: https://www.zhihu.com/special/19681091
  • 網易: https://news.163.com/special/epidemic/

我使用的是騰訊數據源,數據為JSON格式, 也很容易解析。下面我以Chrome瀏覽器為例,演示如何獲取騰訊數據接口的地址。

打開鏈接之后,按F12,切換到開發者模式。再次刷新網頁,切換到Network,按Ctrl+F搜索當前全國確診的人數:44765,然后回車,可以看到這個數據包含在一個JSON字符串中,而這個字符串是某一個請求地址返回的數據,而這個地址,就是數據的接口地址。

為了證實這個接口是正確的,我們復制這個地址,然后在地址欄輸入回車,可以看到返回了一大堆字符串:

說明我們的地址找對了。完整的地址:

https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery34109263209025042043_1581518730600&_=1581518730601

其中:

  • callback=jQuery34....00參數是指定的回調函數名,可省略。
  • _=1581518730601是時間戳,可用於查詢歷史數據,可省略。

時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總毫秒數。

所以,如果想獲取最新數據,以上兩個參數可省略:
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5

如果想獲取歷史數據,只需要修改時間戳即可,其他網站的接口地址獲取方式也大同小異。

這里我們只使用騰訊新聞的接口就夠了,保存JSON文件,並格式化處理,可以看到包括的信息:

對於騰訊的這個數據,不得不多說一句,最近幾天騰訊的JSON數據更新了好幾次:

  • 感染人數鍵值從string類型改為了int
  • 添加了病死率
  • 添加了湖北內外疫情數據歷史
  • 添加了實時動態新聞

JSON數據文件的大小也從最開始的80KB到現在的160KB左右了。

對於謠言信息,騰訊是放在了另外兩個接口,一個是查詢最新的辟謠信息,一個是獲取一條辟謠信息的詳細內容。同理,和上面的數據接口地址獲取的方法一樣,我們可以獲取到這兩個地址。

查詢最新的辟謠信息的地址:

https://vp.fact.qq.com/loadmore?page=0&callback=jQuery34109263209025042043_1581518730600&_=1581518730603

參數和數據接口一樣,函數名和時間戳可省略:https://vp.fact.qq.com/loadmore?page=0

  • page=0表示獲取辟謠信息的頁數,=0表示最新的辟謠信息,發布時間為今天或者昨天,=1表示發布時間為昨天或前天的,以此類推。

JSON文件格式:

在這個接口里,包含最新的10條辟謠信息,每條辟謠信息中包括標題,發布者,發布時間,圖片地址,謠言類型,謠言id等。通過另一個接口,我們可以查詢某一條辟謠新聞的詳細信息。

如這條辟謠新聞:

  • 標題:陰雨天和大霧天會增加新冠病毒感染風險
  • ID:8be33c500e00257c97419ac24ab59d8f

我們訪問這樣一個地址: https://vp.fact.qq.com/miniArtData?id=8be33c500e00257c97419ac24ab59d8f ,就會得到這條謠言新聞的JSON格式詳細信息,如下:

這個接口在我們實際開發中並沒有使用,而是直接調用瀏覽器去打開這個地址的網頁地址:

https://vp.fact.qq.com/article?id=8be33c500e00257c97419ac24ab59d8f ,不過這個界面是針對手機端的,電腦端的瀏覽效果並不好:

手機端:

4.Qt實現

主要涉及到的Qt知識如下:

  • QCustomPlot繪圖庫的使用
  • HTTP協議發送GET請求
  • JSON數據解析
  • 文件的本地保存和讀取
  • 文本瀏覽器使用 HTML模板顯示富文本
  • 數據的樹形結構展示
  • 基本的信號與槽特性

QCustomplot繪圖:

辟謠信息顯示:

5.主要難點

整個開發的過程,就是解決一個一個問題的過程,很多控件都是第一次使用,好在資料很多,主要難點如下:

  • QCustomPlot繪圖,刻度為文本格式
  • 各省市和海外疫情數據的樹形結構顯示
  • 點擊不同的按鈕,切換顯示不同的數據折線
  • 鼠標在折線上懸停,顯示具體的日期和人數
  • QTextBrower顯示富文本,通過自定義HTML模板,實現類似格式化生成HTML的效果。

歷史數據折線圖顯示:

實時疫情新聞顯示:

實時辟謠信息顯示:

6.打包發布

為了讓沒有安裝Qt環境的用戶也能用上我們開發的Qt程序,我們需要對生成的程序文件進行打包和發布,首先使用Qt自帶的windeploy filename.exe命令,添加運行這個程序所需要的所有組件,然后使用程序打包軟件把這個文件打包成一個setup.exe安裝文件,用於在別的電腦上安裝,或者是打包成一個綠色版軟件,直接雙擊運行,我使用以下兩個軟件進行打包。

  • Inno Setup:可以打包成安裝軟件,可自定義安裝信息。
  • Enigma Virtual Box:可以打包成一個exe軟件,無需安裝,直接雙擊運行。

7.開源地址

本項目Qt工程所有的代碼和安裝包下載地址,我都已經開源,如下:

  • 國外GitHub: https://github.com/whik/qt_2019_ncov
  • 國內Gitee: https://gitee.com/whik/qt_2019_ncov

如果你已經關注了我的公眾號(ID:mcu149),可以在后台回復:疫情監控,我會把Qt工程發送給你。

8.總結

總體來說,這個小項目使用到的Qt知識都是基礎的,可以適合作為練手項目。還是有很多值得優化的地方:

  • 添加一個窗口,用於顯示辟謠新聞的詳細信息,增加一個接口
  • 網絡不穩定會出現卡死現象
  • JSON字符串不輸出到文件,直接保存在QString變量處理
  • 代碼優化,部分功能合成一個函數

9.最后

雖然現在疫情有所緩解,但我們還是不要掉以輕心,好好宅家,趁着有時間,不如多陪陪家人,看幾本書,看幾部經典電影。專業的事交給專業的人去做,而我們只需要做好我們自己應該做的即可。

鍾南山:我們已經采取強力的措施,特別是早發現、早隔離,這兩條做到了,我們有足夠的信心防止大爆發或者重新大爆發。

推薦閱讀


  • 個人博客:www.wangchaochao.top
  • 我的公眾號:mcu149


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM