Qwt 7.0 新特性介绍 — 更现代、更强大的Qt数据可视化库

Qwt 7.0 新特性介绍 --- 更现代、更强大的Qt数据可视化库

上篇文章《Qwt7.0-打造更美观高效的Qt开源绘图控件库》介绍了我将打造的 Qwt 7.0 ,这里展示一下当前的一些成果。

得益于AI的快速发展,Qwt7.0最近也进行了快速迭代,后面很多想法都通过opencode+oh-my-opencode+superpowers+GLM5模型实现的,这套组合下来完全满足日常的开发,具体调校可以看我另外一个文章:《AI 编程工具的经验及多智能体调校》

Qwt7+的仓库地址:

Github:https://github.com/czyt1988/QWT

Gitee:https://gitee.com/czyt1988/QWT

在这个项目的Github里有个很有意思的issue,其实 Qt 还有以下两种绘图库可用:https://github.com/czyt1988/QWT/issues/2,它提到了Qt可行的另外一个绘图库,是ImGui+ImPlot的结合,能实现openGL的高性能渲染和2D+3D的绘图,我认真学习了一下ImGui+ImPlot,觉得很有意思

于是我蹭着在过年的时候,又封装了一个库叫QIm,把ImGui+ImPlot嵌入到了Qt中,实现像普通Qt窗口那样简单的使用ImGui+ImPlot

QIm的地址:

Github:https://github.com/czyt1988/QIm

Gitee:https://gitee.com/czyt1988/QIm

效果:

我觉得这是下一代Qt最佳绘图可视化的库,拥有非常高的性能和自由度。这个项目也是得益于AI,能快速迭代开发,基本上也是opencode+oh-my-opencode+superpowers+GLM5/GLM5.1模型实现的

关于AI编程,尤其在C++/Qt下的AI Coding还有很多想讲的,等有空再写一下,这里主要介绍Qwt 7的一些新特性


Qwt 7.0 是基于原版 Qwt 6.2.0 的现代化改进版本,遵循 Qwt 的开源协议(LGPL)。这个版本带来了C++11/17标准支持CMake构建系统单文件引入方式更多的交互3D绘图等功能,可以让数据可视化开发更加便捷高效,下面逐一介绍一下。

2D/3D绘图一体化

qwt同时支持2D/3D

Qwt 7.0 将原 QwtPlot3D 库整合进来,实现了 2D和3D绘图的一体化支持。现在一个库就能同时满足二维和三维数据可视化需求。

3D绘图模块

Qwt 7.0 内置完整的3D绘图能力,支持:

  • 多种绘图类型:表面图、网格图、参数曲面、函数绘图等
  • OpenGL渲染:高性能三维渲染,流畅的交互体验
  • 交互操作:鼠标旋转、缩放、平移视角
  • 光照和材质:真实感光照效果和材质配置
  • 颜色映射:根据Z值自动映射颜色,支持颜色条

3D绘图效果

核心类介绍

类名 说明
Qwt3DPlot 3D绘图基类,提供基本框架和交互
Qwt3DSurfacePlot 3D表面图,显示连续曲面
Qwt3DGridPlot 3D网格图,显示离散网格数据
Qwt3DFunction 3D函数绘图,根据数学函数生成曲面

具体可点击此链接了解-Qwt-3D绘图简介: https://czyt1988.github.io/QWT/zh/use-guide/3d-plot/

架构与构建升级

C++11/17 标准支持

Qwt 7.0 全面拥抱现代 C++ 标准:

  • Qt5.12+:使用 C++11 标准
  • Qt6:使用 C++17 标准

这意味着您可以使用现代 C++ 特性,如 autonullptroverridefinal、lambda 表达式、智能指针等,代码更加简洁和安全。

CMake 构建系统

告别传统的 qmake,Qwt 7.0 采用现代化的 CMake 构建系统:

cmake 复制代码
find_package(qwt REQUIRED)
# 2D绘图
target_link_libraries(${PROJECT_NAME} PRIVATE qwt::plot)
# 3D绘图
target_link_libraries(${PROJECT_NAME} PRIVATE qwt::plot3d)

单文件引入方式

Qwt 7.0 提供了一种极简的引入方式 ------ 将整个库合并为单文件:

  • src-amalgamate/QwtPlot.h --- 合并后的单一头文件
  • src-amalgamate/QwtPlot.cpp --- 合并后的单一源文件

只需将这两个文件加入您的项目,无需复杂的构建配置,特别适合小型项目或快速原型开发。

QwtFigure --- 多绘图布局容器

QwtFigure 是 Qwt 7.0 最重要的新增功能之一,提供类似 matplotlib Figure 的多绘图布局能力。

功能概述

QwtFigure 是一个用于组织和管理多个 QwtPlot 绘图组件的容器窗口,提供:

  • 归一化坐标布局 :使用 [0,1] 范围内的坐标系统进行相对位置控制
  • 网格布局 :行列式的网格排列,参考 matplotlibsubplot 方式
  • 寄生绘图支持:在同一个绘图区域内创建多个独立坐标轴
  • 图形导出功能:支持图片输出

坐标轴对齐功能

当多个子绘图的刻度范围不同时,刻度线可能不对齐,影响视觉效果。

QwtFigure 提供了坐标轴对齐功能:通过 QwtFigure::addAxisAlignment 函数可以指定子绘图的坐标轴进行对齐:

对齐后的效果:

交互式操作蒙版

QwtFigureWidgetOverlay 提供了在 QwtFigure 上进行交互式操作的功能:

  • 支持鼠标拖拽调整子绘图的位置和大小
  • 支持选择当前激活的绘图组件
  • 提供清晰的可视化反馈(边框、控制点、尺寸信息)

具体可点击此链接了解-Qwt-figure窗口容器: https://czyt1988.github.io/QWT/zh/use-guide/figure-widget/

寄生绘图 --- 多坐标轴系统

寄生绘图(Parasite Axes)允许在同一绘图区域内创建任意多个独立坐标轴,完美解决多Y轴、多X轴的复杂绘图需求。

工作原理

寄生绘图与宿主绘图共享绘图区域(透明背景),但拥有独立的坐标系统。当宿主绘图被销毁时,寄生绘图也会自动销毁,生命周期自动管理。

详细使用方法请参考-Qwt-多坐标轴的创建: https://czyt1988.github.io/QWT/zh/use-guide/parasite-axes/

交互功能重构

Qwt 7.0 对绘图交互进行了全面重构,提供更友好的体验

实时平移 --- QwtPlotPanner

原版 Qwt 的 QwtPanner 使用位图缓存进行平移,平移过程中无法看到数据的实时变化。Qwt 7.0 重构了 QwtPlotPanner,原版的QwtPlotPanner 改名为 QwtPlotCachePanner

详细使用方法及效果请参考-Qwt-平移工具: https://czyt1988.github.io/QWT/zh/use-guide/panner/

特性:

  • 线性坐标轴、对数坐标轴、日期时间坐标轴全支持
  • 多坐标轴实时同步移动
  • 平移过程中绘图实时刷新

整体画布缩放 --- QwtPlotCanvasZoomer

原版 QwtPlotZoomer 只能绑定两个坐标轴,无法处理四轴或有多个坐标轴同时缩放的场景。Qwt 7.0 新增 QwtPlotCanvasZoomer,无需指定坐标轴,自动处理整个画布的缩放:

具体可参见-Qwt-缩放工具: https://czyt1988.github.io/QWT/zh/use-guide/zoomer/

类名变更说明

为保持命名清晰,部分类名进行了调整:

原名称 新名称 说明
QwtPlotZoomer QwtPlotAxisZoomer 只能绑定2个坐标轴,更名为轴缩放器
- QwtPlotCanvasZoomer 新增:整体画布缩放器
QwtPanner QwtCachePanner 带缓存的平移器
QwtPlotPanner QwtPlotCachePanner 带缓存的绘图平移器
- QwtPlotPanner 新增:实时平移器

坐标轴内置交互动作

坐标轴交互动作允许用户通过鼠标直接操作坐标轴,体验类似 QCustomPlotImPlot 的交互方式。

功能演示

坐标轴拖动操作:

  • 左键单击选中坐标轴
  • 拖动移动坐标轴范围
  • 点击坐标轴外位置取消选中

坐标轴滚轮缩放:

  • 左键选中坐标轴
  • 滚轮缩放,缩放中心为鼠标位置

详细使用方法及效果请参考-Qwt-坐标轴交互动作: https://czyt1988.github.io/QWT/zh/use-guide/scale-builtin-action/

数据拾取功能

新增QwtPlotSeriesDataPicker 提供了数据拾取功能,鼠标移动时实时显示数据点信息

提供两种拾取模式

Y值拾取模式:

显示当前 X 位置对应所有曲线的 Y 值,支持线性插值计算。

最近点拾取模式:

计算距离鼠标最接近的点进行拾取,适合峰值数据拾取场景。

详细使用方法及效果请参考-Qwt-数据拾取工具: https://czyt1988.github.io/QWT/zh/use-guide/pick-value/

针对大数据集,Qwt 7 提供了窗口搜索算法:

  • 默认启用阈值:1000 个数据点
  • 搜索窗口默认为曲线点数的 5%
  • 避免全曲线遍历,大幅提升性能

新增图表类型

箱线图 --- QwtPlotBoxChart

QwtPlotBoxChart 提供完整的箱线图(Box-and-Whisker Plot)支持,直观展示数据统计分布特征。

  • 支持预计算数据和原始数据自动计算两种方式
  • 多种须须计算方法:Tukey(1.5×IQR)、百分位数、最小最大值、标准差、标准误
  • 三种箱体样式:矩形、菱形、缺口形
  • 垂直和水平方向切换
  • 异常值自动检测、自定义符号和抖动显示

详细使用方法请参考-箱线图使用指南:https://czyt1988.github.io/QWT/zh/use-guide/boxchart/

其他实用功能

刻度朝内显示

v7.2.1 新特性,支持将坐标轴刻度线显示在绘图区域内部,适合紧凑布局场景。

详细使用方法请参考-刻度朝内显示:https://czyt1988.github.io/QWT/zh/use-guide/ticks-inside/,示例代码位于 examples/2D/ticks_inside

NaN/Inf 异常值处理

Qwt 7.0 对数据中的异常值(NaN、Inf)进行了完善处理:

  • QwtPointMapper 添加异常值处理,数据异常不会导致坐标映射错误
  • 数据范围判断增加异常值过滤
  • 绘图更加稳定,不会因异常数据崩溃

QwtGridRasterData 网格插值

新增 QwtGridRasterData 类,相比 QwtMatrixRasterData

  • 支持二维数据表输入
  • 支持 X/Y 轴网格插值
  • 更灵活的光谱图数据处理

主要用于热力图

迁移指南

  • Qt5.12+ 完全兼容
  • Qt6 完全支持
  • 大部分 Qwt 6.x 代码可直接使用,仅需少量类名替换

总结

Qwt 7.0 是一次全面的现代化升级:

类别 新特性
架构升级 C++11/17、CMake构建、单文件引入
2D/3D一体化 QwtPlot3D融合、统一库支持2D和3D绘图
布局功能 QwtFigure多绘图容器、寄生绘图多坐标轴
交互改进 实时平移、整体画布缩放、坐标轴内置交互
数据拾取 Y值拾取、最近点拾取、智能插值
图表类型 箱线图、刻度朝内显示、3D表面图/网格图
稳定性 NaN/Inf处理、异常值过滤

这些新特性让 Qwt 成为一个更现代、更强大、更易用的 Qt 数据可视化库,一个库同时支持2D和3D绘图,适合科学计算、工程应用、数据分析等多种场景。


Github:https://github.com/czyt1988/QWT

Gitee:https://gitee.com/czyt1988/QWT

另外大家也可以观摩我新开的QIm库

Github:https://github.com/czyt1988/QIm

Gitee:https://gitee.com/czyt1988/QIm

ttps://github.com/czyt1988/QWT](https://github.com/czyt1988/QWT)

Gitee:https://gitee.com/czyt1988/QWT

另外大家也可以观摩我新开的QIm库

Github:https://github.com/czyt1988/QIm

Gitee:https://gitee.com/czyt1988/QIm

在AI的辅助下,目前两个库我都会同步更新

相关推荐
会飞的胖达喵5 小时前
基于qt开发的RedisDesk
开发语言·qt
油炸自行车5 小时前
【Qt】运行 `windeployqt.exe` 打包Qt发布包,遇到警告的解决方法 (Warning: Cannot find any.....)
开发语言·qt·vs·打包·windeployqt·软件部署
Westward-sun.6 小时前
PyQt5入门实战:从零实现一个表达式输入式计算器(附完整代码)
开发语言·qt
Stone_OverLooking7 小时前
vscode 配置Qt qmake项目
ide·vscode·qt
sycmancia7 小时前
Qt——应用程序中的主窗口
开发语言·qt
blog.pytool.com7 小时前
Ubuntu + VSCODE +aarch64 +qt +qmake +clangd
linux·qt·ubuntu
不懒不懒8 小时前
【零基础学 PyQt5:环境搭建、Qt Designer 配置、UI 转 PY、窗口开发全流程】
开发语言·qt·ui
秋月的私语8 小时前
遥感影像拼接线优化工具:基于Qt+GDAL+OpenCV的从二到三实践
开发语言·qt·opencv
ol木子李lo8 小时前
Qt6 替代废弃 QMediaPlaylist 的解决方案
c语言·c++·vscode·qt·个人开发·visual studio·qt6.3