徐瑤


【摘 要】為了更加直觀有效的繪制和顯示雷達產生的大量數據,本文提出了一種Qt平臺下基于QCustomPlot實現曲線繪制和顯示的方法,該方法可以簡單方便的定制曲線窗和曲線的外觀,有效簡化了曲線繪制的流程,降低了開發過程中功能實現的難度。通過在某型雷達顯控軟件中使用該方法繪制和顯示雷達校正樣本數據,驗證了該方法的有效性。
【關鍵詞】QCustomPlot;Qt平臺;校正樣本數據
中圖分類號: TP368.1文獻標識碼: A文章編號: 2095-2457(2019)25-0054-002
DOI:10.19694/j.cnki.issn2095-2457.2019.25.025
0 引言
隨著雷達技術的不斷發展,最終送至雷達顯控軟件界面上顯示的信息也越來越多,以校正樣本數據為例,視校正通道的數量不同,可能需要同時顯示幾十至上百個通道的數據,每個通道又包含幾十至上百個采樣點。如此巨大數量的數據如果采用常規的列表顯示,不但列表數據龐大,而且使用起來效率低下,對操作人員非常不友好。因此,我們需要使用二維圖表來直觀形象的顯示這些數據[1]。
雷達顯控軟件為了繪制曲線信息,采用了多種第三方庫和插件,較為常用的有TeeChart[2]、qwt[3-4]等,其中TeeChart繪制圖形表現形式豐富,但因其是商業軟件,會給部分開發者帶來較大的經濟負擔;qwt具有跨平臺的屬性,代碼開源,但表現形式略顯不足,不能滿足細節需要精細顯示的項目需要。
為實現復雜曲線繪制和顯示,本文提出一種在Qt中基于QCustomPlot來實現的方法。使用該方法可以同時顯示多個曲線窗,改善了之前使用傳統方法處理只能顯示一個曲線窗的狀況。并在每個曲線窗中繪制多條二維曲線,方便進行多條曲線之間的比較。操作人員還可以隨意獲取每條曲線的信息,有利于快速定位問題。該方法容易上手、使用簡便,并且可以跨平臺使用,不但可以解決前文中提到的問題,還可以給軟件操作人員提供更好的數據顯示效果。
1 相關技術
QCustomPlot是在Qt框架下實現的基于LGPL版權協議的開源項目,它無需進一步的庫依賴,文檔豐富且使用方便,主要完成二維曲線的繪圖和數據可視化,如曲線圖、趨勢圖、坐標圖、柱狀圖等。
(1)將幫助文檔qcustomplot.qch復制到Qt目錄下,打開Qt,工具->選項->幫助->添加,選擇qcustomplot.qch,安裝幫助文檔。
(2)將qcustomplot.h文件和qcustomplot.cpp文件復制到工程文件里,并在項目里添加這兩個文件。
(3)在.pro文件中加入語句 QT+=printsupport。
此時就可以將項目中的QWidget控件提升為QCustomPlot控件使用了。
2 復雜曲線繪制及顯示的實現
2.1 曲線窗模塊數據處理流程
仍以雷達顯控軟件中顯示校正樣本數據的曲線窗為例,基于QCustomPlot的曲線窗顯示和繪制模塊主要包括四個部分,即數據接收模塊、數據管理模塊、人機交互模塊和顯示繪制模塊.數據接收模塊接收經由網絡發來的校正樣本數據,數據管理模塊負責對校正樣本數據的解析、保存及管理,人機交互模塊負責實現曲線窗的人機交互功能,顯示繪制模塊負責使用QCustomPlot控件來繪制校正樣本數據,并將其顯示出來。
2.2 曲線窗主窗體設計
曲線窗主窗體包含多個子窗體,均為由QWidget控件提升而成QCustomPlot控件,分別用來顯示校正前和校正后的樣本數據,每個子窗體中同時顯示所有通道的樣本數據,每個通道顯示為一條二維曲線。
2.3 子窗體數據管理設計
在每個子窗體中需要繪制多條二維曲線,每條對應一個通道的樣本數據。對于由數據接收模塊接收到的校正樣本數據,程序首先識別不同的校正樣本數據類型,根據校正樣本數據類型判斷出通道數和每個通道的樣本數。由于數據包中的校正樣本數據是一維線性排列的,需要根據通道數和樣本數解析出每條二維曲線的數據,送給顯示繪制模塊的同時還作為二維數組保存至本地。
2.4 子窗體的繪制顯示設計
2.4.1 設置子窗體和曲線顯示的外觀
設置子窗體外觀的代碼如下:
QCustomPlot * m_CurvePlot;
m_CurvePlot->plot->xAxis->setBasePen(QPen(QColo(239,239,239)));//設置橫軸的顏色
m_CurvePlot->plot->xAxis->setTickPen(QPen(QColor(239,239,239)));//設置橫軸主刻度的顏色
m_CurvePlot->plot->xAxis->setTickLabelFont(QFont("宋體",9));//設置橫軸刻度標記的字體
m_CurvePlot->plot->xAxis->setTickLabelColor(QColor(239,239,239));//設置橫軸刻度標記的顏色
m_CurvePlot->plot->yAxis->setBasePen(QPen(QColor(239,239,239)));//設置縱軸的顏色
m_CurvePlot->plot->yAxis->setTickPen(QPen(QColor(239,239,239)));//設置縱軸主刻度的顏色
m_CurvePlot->plot->yAxis->setTickLabelFont(QFont("宋體",9));//設置縱軸刻度標記的字體
m_CurvePlot->plot->yAxis->setTickLabelColor(QColor(239,239,239));//設置縱軸刻度標記的顏色
m_CurvePlot->plot->setBackground(QBrush(Qt::NoBrush));//設置窗體背景的畫刷
設置子窗體中曲線的顯示樣式的代碼如下:
m_CurvePlot->plot->legend->setVisible(false);//設置圖例說明是否可見
m_CurvePlot->plot->graphs[i]->setLineStyle(QCPGraph::IsLine);//設置線條的樣式
m_CurvePlot->plot->graphs[i]->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle,6));//設置點的樣式
2.4.2 數據更新
首先調用函數setData(const QVector
2.4.3 數據刪除
調用函數removeGraph(graphs[i])刪除給定序號的曲線,再調用函數replot()重繪刪除某些曲線后子窗體的顯示。
2.5 子窗體的人機交互設計
由于校正樣本數據通道數較多,所以本例中設置不顯示圖例,并使用setColor函數給每條曲線設置不同的顏色。但受到顯示器顯示效果和人眼對不同顏色識別能力的制約,當二維曲線數量達到幾十條甚至上百條的時候,操作人員很難通過顏色或圖例來區分不同通道的曲線,故程序中加入選中某條曲線的功能,利用Qt中的信號與槽機制,當操作人員使用鼠標選中某條曲線的時候會自動釋放selectionChangedByUser()信號,將其與槽函數關聯,在槽函數中判斷graphs[i]->selected()為真時的i值,并將其更新到界面上,提示當前選中的曲線序號。
3 應用實例
在某型雷達項目顯控軟件開發中采用Qt5.7.0進行校正樣本數據繪制和顯示,顯示效果如圖4所示。通過實際應用,證明該曲線窗可以很好的滿足項目的實際需求,并且在開發新項目和在不同的平臺上移植時都簡便快捷。
【參考文獻】
[1]丁鷺飛,耿富錄.雷達原理[M].4版.西安:西安電子科技大學出版社,2009:4.
[2]陳俊良,葉林,葛俊鋒,等.TeeChart控件在實時檢測系統上位機軟件中的應用[J].2015,28(6):13-15.
[3]高菲,袁媛,林成地,等.Qwt類庫在二維云圖繪制中的應用[J].現代電子技術,2014,37(14):100-102.