【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库

发布时间:2026/7/5 3:35:01
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库 【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库本文是 Qwt 7.0 系列介绍和教程如果你正在寻找一个高性能、协议友好、同时支持 2D 和 3D 绘图的 Qt 数据可视化库那么这篇文章就是为你准备的。系列总述文章Qwt 7.0 —— 基于 Qt 的高性能 2D/3D 绘图库概述 | 高性能曲线绘制 | 常用图表类型 | 高级科学图表 | 多坐标轴与布局 | 交互功能 | 3D 数据可视化 | 坐标轴与刻度 | 控件与辅助元素 | 总体架构解析 | matplotlib 风格绘图项目地址GitHub | Gitee | 在线文档目录一、引言为什么选择 Qwt 7.0二、Qwt 7.0 核心新特性概览2.1 CMake 构建系统 Qt6 兼容2.2 单文件引入方式2.3 2D/3D 绘图一体化2.4 QwtFigure —— 多绘图布局容器2.5 寄生绘图 —— 多坐标轴系统2.6 坐标轴内置交互动作2.7 实时平移与整体画布缩放2.8 数据拾取功能2.9 箱线图 QwtPlotBoxChart2.10 其他实用改进三、快速集成 Qwt 7.03.1 CMake 引入方式推荐3.2 单文件引入方式四、第一个绘图示例五、与旧版本 Qwt 6.x 的主要区别六、总结与系列预告一、引言为什么选择 Qwt 7.0在 Qt 生态中能用来做数据可视化的库不算多主流选择有QCustomPlot、Qwt、Qt Charts和KDChart。Qt 6.8 之后官方把Qt Charts2D与Qt DataVisualization3D合并为统一的Qt Graphs模块底层全部基于 Qt Quick Scene Graph Qt Quick 3D。但这条路并不适合所有人——Qt Graphs 必须通过QQuickWidget或QQuickWindow嵌入必须带上 QML runtimeC 支持不足且不支持 Win7 等老系统对嵌入式也不友好。我们先来看看几大库的横向对比库协议优势劣势QCustomPlotGPL简单易用开箱即用GPL 传染性商业不友好QwtLGPL性能优越架构合理原作者停止更新部署较难Qt ChartsGPLQt 官方效率低GPL 协议KDChartMIT (3.0)商业友好渲染效果一般可以看到Qwt的 LGPL 协议对商业应用非常友好性能和架构也很优秀。但原版 Qwt 的问题是作者已停止更新构建系统还停留在 qmake 时代对 Qt6 的支持也不完善。Qwt 7.0正是为解决这些问题而生。它基于原版 Qwt 6.2.0 进行维护和改进添加了 CMake 构建、Qt6 兼容、2D/3D 一体化、现代化 UI 风格等大量新功能使其成为协议友好、性能优越、方便使用的 Qt 数据可视化库。如果你之前用过原版 Qwt 6.x你会发现 Qwt 7.0 在保持 API 兼容的前提下做了大量现代化改进。如果你是从 QCustomPlot 或 Qt Charts 转过来的你会发现 Qwt 7.0 的 API 设计更加合理功能也更丰富。二、Qwt 7.0 核心新特性概览Qwt 7.0 相对于原版 Qwt 6.2.0 引入了大量新特性下面逐一介绍。2.1 CMake 构建系统 Qt6 兼容Qwt 7.0 告别了传统的 qmake采用现代化的 CMake 构建系统同时兼容 Qt 5.12 和 Qt 6.x。这意味着C11/17 标准支持Qt5.12 使用 C11Qt6 使用 C17find_package(qwt)一键引入标准的 CMake 包管理现代 C 特性全面使用auto、nullptr、override、final、智能指针、范围 for 循环等对于原版 Qwt 6.x 用户来说这是一个巨大的改进——你不再需要手动配置.pro文件也不需要担心 Qt6 的兼容性问题。2.2 单文件引入方式借鉴 QCustomPlot 的设计理念Qwt 7.0 提供了一种极简的引入方式将整个库合并为单文件。src-amalgamate/QwtPlot.h— 合并后的单一头文件src-amalgamate/QwtPlot.cpp— 合并后的单一源文件只需将这两个文件加入项目无需复杂的构建配置特别适合小型项目或快速原型开发。这在原版 Qwt 6.x 中是不可能做到的——原版需要引入几十个头文件和源文件。注意单文件是由工具自动合成的请勿直接编辑这两个文件。2.3 2D/3D 绘图一体化这是 Qwt 7.0 最重要的改进之一。Qwt 7.0 将原QwtPlot3D库整合进来实现了2D 和 3D 绘图的一体化支持。现在一个库就能同时满足二维和三维数据可视化需求。3D 绘图模块支持多种绘图类型表面图、网格图、参数曲面、函数绘图等OpenGL 高性能渲染流畅的交互体验鼠标旋转、缩放、平移视角光照和材质效果根据 Z 值自动映射颜色支持颜色条核心 3D 类位于Qwt3D命名空间下类名说明Qwt3D::Plot3D3D 绘图基类提供基本框架和交互Qwt3D::SurfacePlot3D 表面图显示连续曲面Qwt3D::Function3D 函数绘图根据数学函数生成曲面CMake 中只需链接不同的 target 即可选择 2D 或 3D 模块# 2D 绘图 target_link_libraries(${PROJECT_NAME} PRIVATE qwt::plot) # 3D 绘图可选 target_link_libraries(${PROJECT_NAME} PRIVATE qwt::plot3d)2.4 QwtFigure —— 多绘图布局容器QwtFigure是 Qwt 7.0 最重要的新增功能之一提供类似 matplotlib Figure 的多绘图布局能力。在原版 Qwt 6.x 中如果你想在同一个窗口中放置多个绘图需要手动管理布局非常麻烦。Qwt 7.0 的QwtFigure彻底解决了这个问题。主要功能包括归一化坐标布局使用[0,1]范围内的坐标系统进行相对位置控制网格布局行列式的网格排列类似 matplotlib 的 subplot寄生绘图支持在同一个绘图区域内创建多个独立坐标轴图形导出功能支持高分辨率图片输出交互式操作蒙版QwtFigureWidgetOverlay支持鼠标拖拽调整子绘图的位置和大小使用示例// 创建 QwtFigureQwtFigure*figurenewQwtFigure();figure-setSizeInches(8,6);// 设置图形尺寸// 使用网格布局添加绘图类似 matplotlib subplotQwtPlot*plot1newQwtPlot();figure-addGridAxes(plot1,2,2,0,0);// 2x2 网格第0行第0列QwtPlot*plot2newQwtPlot();figure-addGridAxes(plot2,2,2,0,1);// 第0行第1列2.5 寄生绘图 —— 多坐标轴系统寄生绘图Parasite Axes允许在同一绘图区域内创建任意多个独立坐标轴完美解决多 Y 轴、多 X 轴的复杂绘图需求。原版 Qwt 6.x 最多只支持 4 个坐标轴上、下、左、右各一个而 Qwt 7.0 的寄生绘图架构突破了这一限制。寄生绘图与宿主绘图共享绘图区域透明背景但拥有独立的坐标系统。当宿主绘图被销毁时寄生绘图也会自动销毁生命周期自动管理。// 创建宿主绘图QwtPlot*hostPlotnewQwtPlot();// 创建寄生绘图显示在 YLeft 轴QwtPlot*parasitePlothostPlot-createParasitePlot(QwtAxis::YLeft);// 添加曲线到寄生绘图QwtPlotCurve*curvenewQwtPlotCurve(Parasite Curve);curve-setSamples(...);curve-attach(parasitePlot);2.6 坐标轴内置交互动作这是 Qwt 7.0.5 引入的新特性。坐标轴交互动作允许用户通过鼠标直接操作坐标轴体验类似 QCustomPlot 的交互方式。原版 Qwt 6.x 要实现这种交互需要自己写大量代码而 Qwt 7.0 默认就内置了。功能包括左键单击选中坐标轴拖动移动坐标轴范围滚轮缩放缩放中心为鼠标位置右键取消选中// 全局启用/禁用plot-setEnableScaleBuildinActions(true);// 单独配置某个坐标轴的行为plot-axisWidget(QwtAxis::XBottom)-setBuildinActions(QwtScaleWidget::ActionClickPan);2.7 实时平移与整体画布缩放原版 Qwt 的QwtPanner使用位图缓存进行平移平移过程中无法看到数据的实时变化。Qwt 7.0 重构了QwtPlotPanner基于QwtPicker状态机实现实时平移特性包括线性坐标轴、对数坐标轴、日期时间坐标轴全支持多坐标轴实时同步移动平移过程中绘图实时刷新此外Qwt 7.0 还新增了QwtPlotCanvasZoomer无需指定坐标轴自动处理整个画布的缩放解决了原版QwtPlotZoomer只能绑定两个坐标轴的局限。// 创建整体画布缩放器QwtPlotCanvasZoomer*canvasZoomernewQwtPlotCanvasZoomer(plot-canvas());2.8 数据拾取功能QwtPlotSeriesDataPickerv7.0.6提供了强大的数据拾取功能鼠标移动时实时显示数据点信息。支持两种拾取模式Y 值拾取模式显示当前 X 位置对应所有曲线的 Y 值支持线性插值计算最近点拾取模式计算距离鼠标最接近的点进行拾取适合峰值数据拾取场景// 创建数据拾取器QwtPlotSeriesDataPicker*pickernewQwtPlotSeriesDataPicker(plot-canvas());picker-setPickMode(QwtPlotSeriesDataPicker::PickYValue);picker-setInterpolationMode(QwtPlotSeriesDataPicker::LinearInterpolation);针对大数据集Qwt 7.0 还提供了窗口搜索算法优化默认在数据点超过 1000 个时启用搜索窗口默认为曲线点数的 5%避免全曲线遍历大幅提升性能。2.9 箱线图 QwtPlotBoxChartQwtPlotBoxChartv7.2.0提供完整的箱线图Box-and-Whisker Plot支持直观展示数据统计分布特征。这是原版 Qwt 6.x 所不具备的图表类型。功能特性支持预计算数据和原始数据自动计算两种方式多种须须计算方法Tukey(1.5×IQR)、百分位数、最小最大值、标准差、标准误三种箱体样式矩形、菱形、缺口形垂直和水平方向切换异常值自动检测、自定义符号和抖动显示// 创建箱线图QwtPlotBoxChart*boxChartnewQwtPlotBoxChart(数据组A);boxChart-attach(plot);// 设置预计算的统计数据QVectorQwtBoxSamplesamples;samplesQwtBoxSample(1.0,10.0,20.0,35.0,50.0,60.0);boxChart-setSamples(samples);// 设置样式boxChart-setBrush(QColor(100,150,200,150));boxChart-setBoxStyle(QwtPlotBoxChart::Notch);2.10 其他实用改进除了上述重大特性Qwt 7.0 还有许多实用改进美化控件风格去除老旧浮雕风格现代化 UI 设计扁平化控件滑块、旋钮、刻度盘等控件支持 Flat 风格样式超大规模数据渲染优化4 种曲线降采样算法 SIMD 加速百万级数据流畅渲染颜色循环系统可自定义的颜色循环自动为系列数据分配颜色22 种科学 colormap 预设viridis、plasma、jet、hot 等刻度朝内显示支持将坐标轴刻度线显示在绘图区域内部NaN/Inf 异常值处理数据异常不会导致坐标映射错误或崩溃QwtGridRasterData 网格插值比QwtMatrixRasterData更灵活的光谱图数据处理柱状图接口增强支持 Pen/Brush 样式设置更丰富的外观定制三、快速集成 Qwt 7.0Qwt 7.0 提供两种引入方式CMake 引入推荐和单文件引入。3.1 CMake 引入方式推荐这是官方推荐的引入方式。首先需要编译并安装 Qwt 7.0 到本地然后通过find_package引入。步骤 1指定 QWT 安装目录可选如果你使用了自定义安装路径需要设置qwt_DIR变量指向安装目录下的lib/cmake/qwt# 如果是默认安装路径这步可以省略 set(qwt_DIR C:/src/my-install-path/cmake/qwt)步骤 2使用 find_package 加载库find_package(qwt REQUIRED) # 链接 2D 绘图库会自动添加 Qt 依赖 target_link_libraries(YOU_APP_TARGET PRIVATE qwt::plot) # 链接 3D 绘图库可选会自动添加 Qt 和 OpenGL 依赖 target_link_libraries(YOU_APP_TARGET PRIVATE qwt::plot3d)Qwt 7.0 提供三个 CMake 模块模块CMake target说明coreqwt::core公共基础库颜色、数学、数据类型、坐标变换等 28 个模块plotqwt::plot2D 绘图库原 qwt 功能集成plot3dqwt::plot3d3D 绘图库qwtplot3d 功能集成依赖说明plot和plot3d都依赖core模块但彼此独立。引入qwt::plot或qwt::plot3d时会自动添加 Qt 依赖Core、Gui、Widgets、Concurrent、PrintSupport可选 Svg、OpenGL无需手动管理。3.2 单文件引入方式如果你不想编译安装 Qwt 库或者项目较小可以使用单文件引入方式。只需将src-amalgamate/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.12 COMPONENTS Core Gui Widgets Svg Concurrent OpenGL PrintSupport REQUIRED) add_executable(YOU_APP_TARGET main.cpp QwtPlot.h QwtPlot.cpp # 你的项目其他文件 ) target_link_libraries(YOU_APP_TARGET PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Svg Qt${QT_VERSION_MAJOR}::Concurrent Qt${QT_VERSION_MAJOR}::OpenGL Qt${QT_VERSION_MAJOR}::PrintSupport ) # Qt6 还需要 OpenGLWidgets if(${QT_VERSION_MAJOR} EQUAL 6) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS OpenGLWidgets REQUIRED) target_link_libraries(YOU_APP_TARGET PRIVATE Qt${QT_VERSION_MAJOR}::OpenGLWidgets) endif() # 单文件引入也需要 OpenGL find_package(OpenGL COMPONENTS OpenGL REQUIRED) target_link_libraries(YOU_APP_TARGET PRIVATE OpenGL::GLU)提示Qwt 7.1 之后合并了 qwtplot3d 库因此单文件引入也需要 OpenGL 相关依赖。作为现代 C 项目强烈推荐使用 CMake 引入方式所有依赖都在 CMake 配置中自动处理。四、第一个绘图示例下面通过一个完整的示例快速了解 QwtPlot 的基本使用方法。这个示例来自项目中的examples/2D/simpleplot。完整代码#includeQwtPlot#includeQwtPlotCurve#includeQwtPlotGrid#includeQwtSymbol#includeQwtLegend#includeQApplicationintmain(intargc,char*argv[]){QApplicationapp(argc,argv);// 1. 创建绘图窗口QwtPlot plot;plot.setWindowTitle(Plot Demo);// 设置窗口标题plot.setCanvasBackground(Qt::white);// 设置画布背景色plot.setAxisScale(QwtAxis::YLeft,0.0,10.0);// 设置 Y 轴范围plot.insertLegend(newQwtLegend());// 添加图例// 2. 创建并添加网格QwtPlotGrid*gridnewQwtPlotGrid();grid-attach(plot);// 网格必须附加到绘图才能显示// 3. 创建曲线QwtPlotCurve*curvenewQwtPlotCurve();curve-setTitle(Some Points);// 曲线标题显示在图例中curve-setPen(Qt::blue,4);// 设置线条颜色和宽度curve-setRenderHint(QwtPlotItem::RenderAntialiased,true);// 抗锯齿// 4. 设置曲线符号QwtSymbol*symbolnewQwtSymbol(QwtSymbol::Ellipse,// 符号形状椭圆QBrush(Qt::yellow),// 符号填充色QPen(Qt::red,2),// 符号边框QSize(8,8)// 符号大小);curve-setSymbol(symbol);// 5. 设置曲线数据QPolygonF points;pointsQPointF(0.0,4.4)QPointF(1.0,3.0)QPointF(2.0,4.5)QPointF(3.0,6.8)QPointF(4.0,7.9)QPointF(5.0,7.1);curve-setSamples(points);// 6. 将曲线附加到绘图curve-attach(plot);// 7. 显示绘图窗口plot.resize(600,400);plot.show();returnapp.exec();}代码解析核心概念QwtPlot是绘图的主容器继承自QFrame。一个 QwtPlot 可以包含多个绘图项Plot Item如曲线、网格、标记等所有绘图项都需要通过attach()方法附加到 QwtPlot 才能显示。基本使用流程创建 QwtPlot 对象— 设置标题、背景色、坐标轴范围创建绘图项— 网格、曲线、标记等设置绘图项属性和数据— 颜色、线宽、符号、数据点附加到 QwtPlot— 通过attach()方法显示绘图— 调用show()和replot()绘图项生命周期当绘图项附加到 QwtPlot 后QwtPlot 会持有该绘图项的引用。在 QwtPlot 销毁时所有附加的绘图项也会被自动删除因此你不需要手动管理绘图项的内存。坐标轴系统QwtPlot 默认提供四个坐标轴位置坐标轴位置枚举值说明底部 X 轴QwtAxis::XBottom默认显示顶部 X 轴QwtAxis::XTop默认隐藏左侧 Y 轴QwtAxis::YLeft默认显示右侧 Y 轴QwtAxis::YRight默认隐藏数据设置方式setSamples()支持多种数据输入方式方法说明setSamples(const QPolygonF)从 QPointF 数组设置setSamples(const QVectordouble x, const QVectordouble y)从两个数组设置setSamples(const double* x, const double* y, int size)从原始数组设置setRawSamples(const double* x, const double* y, int size)直接引用外部数组不复制性能提示对于实时更新的场景建议关闭自动刷新setAutoReplot(false)在批量更新完成后手动调用一次replot()这样可以避免频繁刷新带来的性能开销。五、与旧版本 Qwt 6.x 的主要区别如果你之前使用过原版 Qwt 6.x在迁移到 Qwt 7.0 时需要注意以下变更。类名变更对照表为保持命名清晰部分类名进行了调整原名称Qwt 6.x新名称Qwt 7.0说明QwtPlotZoomerQwtPlotAxisZoomer只能绑定 2 个坐标轴更名为轴缩放器-QwtPlotCanvasZoomer新增整体画布缩放器不限轴数QwtPannerQwtCachePanner带缓存的平移器原版行为QwtPlotPannerQwtPlotCachePanner带缓存的绘图平移器原版行为-QwtPlotPanner新增实时平移器基于 QwtPickerAPI 变更QwtLinearColorMap::colorStop()更名为stopPos()QwtLinearColorMap新增stopColors()方法QwtColorMap::rgb()方法签名变更v7.3.1已移至 core 模块迁移提示大部分 Qwt 6.x 代码可直接使用仅需少量类名替换如需使用原来的缓存式平移将QwtPanner替换为QwtCachePanner即可如需使用原来的缩放器将QwtPlotZoomer替换为QwtPlotAxisZoomer即可Qt5.12 和 Qt6 完全兼容网上常见的Qwt3DPlot3D/Qwt3DSurfacePlot/Qwt3DFunction写法是错误的真实类名在类本身上省略了冗余的Qwt3D前缀正确写法是Qwt3D::Plot3D、Qwt3D::SurfacePlot、Qwt3D::Function六、总结与系列预告Qwt 7.0 是一次全面的现代化升级核心改进可以用下表概括类别新特性架构升级C11/17、CMake 构建、单文件引入2D/3D 一体化融合 QwtPlot3D统一库支持 2D 和 3D 绘图布局功能QwtFigure 多绘图容器、寄生绘图多坐标轴交互改进实时平移、整体画布缩放、坐标轴内置交互数据拾取Y 值拾取、最近点拾取、智能插值图表类型箱线图、3D 表面图/网格图、刻度朝内显示性能优化4 种降采样算法 SIMD 加速、百万级数据流畅渲染稳定性NaN/Inf 处理、异常值过滤相比原版 Qwt 6.xQwt 7.0 在保持 API 兼容的前提下通过现代化的构建系统、2D/3D 一体化设计、丰富的交互功能和性能优化成为了一个更现代、更强大、更易用的 Qt 数据可视化库。LGPL 协议也使其成为商业应用的理想选择。系列预告本系列后续文章将深入讲解 Qwt 7.0 的各个方面第 1 篇快速入门与核心新特性概览第 2 篇曲线绘图详解 —— 从基础到百万级数据性能优化第 3 篇常用图表类型实战 —— 柱状图、散点图、箱线图与直方图第 4 篇高级科学图表 —— 光谱图、向量场、K线图与极坐标绘图第 5 篇多坐标轴与多绘图布局 —— 寄生绘图与 QwtFigure 容器第 6 篇交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取第 7 篇3D 数据可视化 —— OpenGL 高性能三维绘图第 8 篇坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内第 9 篇控件与辅助元素 —— 滑块旋钮、标记与装饰第 10 篇总体架构解析 —— 从单体到三库模块化的演进第 11 篇matplotlib 风格绘图 —— QwtPyPlot 接口详解敬请关注相关链接GitHubhttps://github.com/czyt1988/QWTGiteehttps://gitee.com/czyt1988/QWT在线文档https://czyt1988.github.io/QWT/zh/系列总述文章https://blog.csdn.net/czyt1988/article/details/160193393