宅家無聊,不如學點技術!
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