基於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