1. 程式人生 > >基於Qt的新冠肺炎疫情資料實時監控平臺(開源小專案)

基於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.最後

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

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

推薦閱讀

  • Qt平臺下使用QJson解析和構建JSON字串
  • Qt實現軟體自動更新的一種簡單方法
  • Qt小專案之串列埠助手控制LED
  • 詳解EMC測試國家標準GB/T 17626
  • 電路板上的這些標誌你都知道是什麼含義嗎?

  • 個人部落格:www.wangchaochao.top
  • 我的公眾號:mcu149