概述
Qt 生態里能畫圖的庫不多,主流的為QCustomPlot
、Qwt
、Qt Charts
和KDChart
,Qt6.8之后把原來的 Qt Charts
(2D) 與 Qt DataVisualization(3D) 合并為統一的Qt Graphs模塊(注意不是Qt Graphics),底層全部基于 Qt Quick Scene Graph(QSG)+ Qt Quick 3D,徹底放棄了老舊的 Graphics-View/QPainter 管線,不過Qt Graphs 須通過 QQuickWidget 或 QQuickWindow 嵌入,必須帶 QML runtime,C++支持不足,論壇吐槽不少,雖然Qt Graphs 是 Qt 官方“大一統”的未來,但這個未來可能3年內不會到來,且不支持win7等老系統,對嵌入式也不友好,因此,QCustomPlot
、Qwt
、Qt Charts
和KDChart
還會是最近幾年繪圖控件的選項。
這幾個控件QCustomPlot
最簡單、美觀,推廣度最高,只要引入qcustomplot.h
頭文件,qcustomplot.cpp
源文件,就可以直接使用(官方文檔),也支持Qt6,然而QCustomPlot
最大的問題是其開源協議為GPL
,有傳染性,如果你使用了QCustomPlot
,意味著你的軟件也要成為GPL
,這對商業非常不友好。
Qwt
是老牌的繪圖控件(官方文檔),有著不錯的性能,但部署難,讓很多人望而怯步。它的協議為LGPL
,商業相對友好。
Qt Charts
是Qt官方的繪圖控件(官方文檔),效率不高(可以說很低),不適合做科學計算,同時,Qt Charts 沒有 LGPL 選項,開源版是GPLv3,只要你在項目中使用了Qt Charts,就必須 把整個項目以 GPLv3 協議開源。
KDChart
是KDAB的繪圖控件(官方文檔),KDChart3.0
起是MIT協議,對商業非常友好,但渲染效果一般,一股excel2003的風格,但KDChart
有甘特圖,這是上面3款都沒有的。
因此,如果你的項目需要商業用途,那么你只有Qwt
和KDChart3.0
兩種選擇,但Qwt
作者停止更新,我個人更喜歡Qwt
,因為Qwt
的架構更符合軟件工程原則,其大規模渲染性能更優,像QCustomPlot
的優勢是交互功能開箱即用,例如鼠標縮放,坐標軸縮放,而Qwt
需要較多的代碼來實現,但Qwt
有著更精細的控制能力,因此在我的項目需要繪圖的時候,我會選擇Qwt
,并根據我的需求添加一些自己需要的功能,改進、優化它,因此,就有了此項目。
Qwt 7.0
我在Qwt
最后版本上進行了維護,后續我將我需要的功能添加進去,同時逐步修改、優化一些已有的功能,例如它默認的老舊樣式
項目地址為:
Github:https://github.com/czyt1988/QWT
Gitee:https://gitee.com/czyt1988/QWT
下面是我的目標以及目前我已經完成的一些工作:
- CMake支持
- 支持Qt6
- C++11優化
- 合并為單一文件,簡化引入
- 優化超大規模數據的渲染
- 提供一些集成的交互方法,讓使用更簡單
- 美化控件
- 提供Figure實現繪圖的布局
- 增加寄生軸的支持,實現n個坐標軸
總之,我將繼續維護Qwt
,讓其成為一個協議友好,性能優越,方便使用的Qt繪圖庫
Qwt7.0的新特性
Cmake支持
Qwt7.0已經支持CMake
,并且未來將考慮拋棄QMake
安裝Qwt后,你的項目只需如下即可引入Qwt,免去以往繁瑣的配置和預定義宏:
target_link_libraries(${YOU_APP_TARGET} PUBLIC qwt::qwt)
單一頭文件和源文件
參考QCustomPlot
,我把原Qwt
整個工程合并為QwtPlot.h
和QwtPlot.cpp
,只要把這兩個文件引入項目即可使用:
cmake示例:
# QwtPlot依賴Core Gui Widgets Svg Concurrent OpenGL PrintSupport這幾個模塊,需要引入工程
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} 5.8 COMPONENTS Core Gui Widgets Svg Concurrent OpenGL PrintSupport REQUIRED)add_executable(YOU_APP_TARGETmain.cppQwtPlot.hQwtPlot.cpp
)target_link_libraries(YOU_APP_TARGET PUBLICQt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::WidgetsQt${QT_VERSION_MAJOR}::SvgQt${QT_VERSION_MAJOR}::ConcurrentQt${QT_VERSION_MAJOR}::OpenGLQt${QT_VERSION_MAJOR}::PrintSupport)
美化了風格
原有的Qwt樣式使用的是很老舊的浮雕風,和現代審美不符,為此我針對性的優化,qwt6.3的效果如下:
優化后的效果如下:
主要去除了默認的凹陷風格,坐標軸緊貼繪圖不進行分離,總體視覺更符合現代風格
增加了Figure繪圖容器
類似Python的matplotlib,Qwt提供了Figure繪圖容器,可以很方便的進行多個繪圖布局
通過新增的QwtFigure
類,可以很方便的進行多個繪圖布局,支持網格布局(類似matplotlib的subplot)
待辦事項
QwtFigure
增加寄生軸功能
科學繪圖經常要求多個坐標軸,例如:一個繪圖區域,有多個Y軸,共享一個X軸,或者多個X軸,共享一個Y軸,目前就算QCustomPlot
也只能實現同一個方向2個坐標軸,而不能無限多,為此,將參考matplotlib的實現,實現一個寄生軸功能,可以增加多個坐標軸
優化超大規模數據的渲染
針對超大規模數據,Qwt的并沒有做渲染優化,雖然現在對于百萬數據性能尚可,但300萬以上還是能感覺到有一定卡頓,后續將采取抽稀算法,優化超大規模數據的渲染,盡量能實現千萬至億級數據的快速渲染
添加一些集成的交互方法
提供一些開箱即用的交互方法,例如數據拾取,數據標尺,也同時參考EChart的一些效果進行集成
我將繼續維護Qwt
,讓其成為一個協議友好,性能優越,方便使用的Qt繪圖庫,如果大家使用有什么需求,可以提出