【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?)
  • [二、Qwt 7.0 核心新特性概览](#二、Qwt 7.0 核心新特性概览)
    • [2.1 CMake 构建系统 + Qt6 兼容](#2.1 CMake 构建系统 + Qt6 兼容)
    • [2.2 单文件引入方式](#2.2 单文件引入方式)
    • [2.3 2D/3D 绘图一体化](#2.3 2D/3D 绘图一体化)
    • [2.4 QwtFigure ------ 多绘图布局容器](#2.4 QwtFigure —— 多绘图布局容器)
    • [2.5 寄生绘图 ------ 多坐标轴系统](#2.5 寄生绘图 —— 多坐标轴系统)
    • [2.6 坐标轴内置交互动作](#2.6 坐标轴内置交互动作)
    • [2.7 实时平移与整体画布缩放](#2.7 实时平移与整体画布缩放)
    • [2.8 数据拾取功能](#2.8 数据拾取功能)
    • [2.9 箱线图 QwtPlotBoxChart](#2.9 箱线图 QwtPlotBoxChart)
    • [2.10 其他实用改进](#2.10 其他实用改进)
  • [三、快速集成 Qwt 7.0](#三、快速集成 Qwt 7.0)
    • [3.1 CMake 引入方式(推荐)](#3.1 CMake 引入方式(推荐))
    • [3.2 单文件引入方式](#3.2 单文件引入方式)
  • 四、第一个绘图示例
  • [五、与旧版本 Qwt 6.x 的主要区别](#五、与旧版本 Qwt 6.x 的主要区别)
  • 六、总结与系列预告

一、引言:为什么选择 Qwt 7.0?

在 Qt 生态中,能用来做数据可视化的库不算多,主流选择有 QCustomPlotQwtQt ChartsKDChart。Qt 6.8 之后,官方把 Qt Charts(2D)与 Qt DataVisualization(3D)合并为统一的 Qt Graphs 模块,底层全部基于 Qt Quick Scene Graph + Qt Quick 3D。但这条路并不适合所有人------Qt Graphs 必须通过 QQuickWidgetQQuickWindow 嵌入,必须带上 QML runtime,C++ 支持不足,且不支持 Win7 等老系统,对嵌入式也不友好。

我们先来看看几大库的横向对比:

协议 优势 劣势
QCustomPlot GPL 简单易用,开箱即用 GPL 传染性,商业不友好
Qwt LGPL 性能优越,架构合理 原作者停止更新,部署较难
Qt Charts GPL Qt 官方 效率低,GPL 协议
KDChart MIT (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。这意味着:

  • C++11/17 标准支持:Qt5.12+ 使用 C++11,Qt6 使用 C++17
  • find_package(qwt) 一键引入:标准的 CMake 包管理
  • 现代 C++ 特性 :全面使用 autonullptroverridefinal、智能指针、范围 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::Plot3D 3D 绘图基类,提供基本框架和交互
Qwt3D::SurfacePlot 3D 表面图,显示连续曲面
Qwt3D::Function 3D 函数绘图,根据数学函数生成曲面

CMake 中只需链接不同的 target 即可选择 2D 或 3D 模块:

cmake 复制代码
# 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 支持鼠标拖拽调整子绘图的位置和大小

使用示例:

cpp 复制代码
// 创建 QwtFigure
QwtFigure* figure = new QwtFigure();
figure->setSizeInches(8, 6);  // 设置图形尺寸

// 使用网格布局添加绘图(类似 matplotlib subplot)
QwtPlot* plot1 = new QwtPlot();
figure->addGridAxes(plot1, 2, 2, 0, 0);  // 2x2 网格,第0行第0列

QwtPlot* plot2 = new QwtPlot();
figure->addGridAxes(plot2, 2, 2, 0, 1);  // 第0行第1列

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

寄生绘图(Parasite Axes)允许在同一绘图区域内创建任意多个独立坐标轴,完美解决多 Y 轴、多 X 轴的复杂绘图需求。原版 Qwt 6.x 最多只支持 4 个坐标轴(上、下、左、右各一个),而 Qwt 7.0 的寄生绘图架构突破了这一限制。

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

cpp 复制代码
// 创建宿主绘图
QwtPlot* hostPlot = new QwtPlot();

// 创建寄生绘图,显示在 YLeft 轴
QwtPlot* parasitePlot = hostPlot->createParasitePlot(QwtAxis::YLeft);

// 添加曲线到寄生绘图
QwtPlotCurve* curve = new QwtPlotCurve("Parasite Curve");
curve->setSamples(...);
curve->attach(parasitePlot);

2.6 坐标轴内置交互动作

这是 Qwt 7.0.5+ 引入的新特性。坐标轴交互动作允许用户通过鼠标直接操作坐标轴,体验类似 QCustomPlot 的交互方式。原版 Qwt 6.x 要实现这种交互需要自己写大量代码,而 Qwt 7.0 默认就内置了。

功能包括:

  • 左键单击选中坐标轴
  • 拖动移动坐标轴范围
  • 滚轮缩放,缩放中心为鼠标位置
  • 右键取消选中
cpp 复制代码
// 全局启用/禁用
plot->setEnableScaleBuildinActions(true);

// 单独配置某个坐标轴的行为
plot->axisWidget(QwtAxis::XBottom)->setBuildinActions(QwtScaleWidget::ActionClickPan);

2.7 实时平移与整体画布缩放

原版 Qwt 的 QwtPanner 使用位图缓存进行平移,平移过程中无法看到数据的实时变化。Qwt 7.0 重构了 QwtPlotPanner,基于 QwtPicker 状态机实现实时平移

特性包括:

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

此外,Qwt 7.0 还新增了 QwtPlotCanvasZoomer,无需指定坐标轴,自动处理整个画布的缩放,解决了原版 QwtPlotZoomer 只能绑定两个坐标轴的局限。

cpp 复制代码
// 创建整体画布缩放器
QwtPlotCanvasZoomer* canvasZoomer = new QwtPlotCanvasZoomer(plot->canvas());

2.8 数据拾取功能

QwtPlotSeriesDataPicker(v7.0.6+)提供了强大的数据拾取功能,鼠标移动时实时显示数据点信息。

支持两种拾取模式:

  • Y 值拾取模式:显示当前 X 位置对应所有曲线的 Y 值,支持线性插值计算
  • 最近点拾取模式:计算距离鼠标最接近的点进行拾取,适合峰值数据拾取场景
cpp 复制代码
// 创建数据拾取器
QwtPlotSeriesDataPicker* picker = new QwtPlotSeriesDataPicker(plot->canvas());
picker->setPickMode(QwtPlotSeriesDataPicker::PickYValue);
picker->setInterpolationMode(QwtPlotSeriesDataPicker::LinearInterpolation);

针对大数据集,Qwt 7.0 还提供了窗口搜索算法优化:默认在数据点超过 1000 个时启用,搜索窗口默认为曲线点数的 5%,避免全曲线遍历,大幅提升性能。

2.9 箱线图 QwtPlotBoxChart

QwtPlotBoxChart(v7.2.0+)提供完整的箱线图(Box-and-Whisker Plot)支持,直观展示数据统计分布特征。这是原版 Qwt 6.x 所不具备的图表类型。

功能特性:

  • 支持预计算数据和原始数据自动计算两种方式
  • 多种须须计算方法:Tukey(1.5×IQR)、百分位数、最小最大值、标准差、标准误
  • 三种箱体样式:矩形、菱形、缺口形
  • 垂直和水平方向切换
  • 异常值自动检测、自定义符号和抖动显示
cpp 复制代码
// 创建箱线图
QwtPlotBoxChart* boxChart = new QwtPlotBoxChart("数据组A");
boxChart->attach(plot);

// 设置预计算的统计数据
QVector<QwtBoxSample> samples;
samples << QwtBoxSample(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.0

Qwt 7.0 提供两种引入方式:CMake 引入(推荐)和单文件引入。

3.1 CMake 引入方式(推荐)

这是官方推荐的引入方式。首先需要编译并安装 Qwt 7.0 到本地,然后通过 find_package 引入。

步骤 1:指定 QWT 安装目录(可选)

如果你使用了自定义安装路径,需要设置 qwt_DIR 变量指向安装目录下的 lib/cmake/qwt

cmake 复制代码
# 如果是默认安装路径,这步可以省略
set(qwt_DIR "C:/src/my-install-path/cmake/qwt")

步骤 2:使用 find_package 加载库

cmake 复制代码
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 说明
core qwt::core 公共基础库(颜色、数学、数据类型、坐标变换等 28 个模块)
plot qwt::plot 2D 绘图库,原 qwt 功能集成
plot3d qwt::plot3d 3D 绘图库,qwtplot3d 功能集成

依赖说明plotplot3d 都依赖 core 模块,但彼此独立。引入 qwt::plotqwt::plot3d 时会自动添加 Qt 依赖(Core、Gui、Widgets、Concurrent、PrintSupport,可选 Svg、OpenGL),无需手动管理。

3.2 单文件引入方式

如果你不想编译安装 Qwt 库,或者项目较小,可以使用单文件引入方式。只需将 src-amalgamate/QwtPlot.hQwtPlot.cpp 两个文件加入项目即可。

对应的 CMake 配置如下:

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

完整代码

cpp 复制代码
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotGrid>
#include <QwtSymbol>
#include <QwtLegend>

#include <QApplication>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    // 1. 创建绘图窗口
    QwtPlot plot;
    plot.setWindowTitle("Plot Demo");           // 设置窗口标题
    plot.setCanvasBackground(Qt::white);        // 设置画布背景色
    plot.setAxisScale(QwtAxis::YLeft, 0.0, 10.0); // 设置 Y 轴范围
    plot.insertLegend(new QwtLegend());         // 添加图例

    // 2. 创建并添加网格
    QwtPlotGrid* grid = new QwtPlotGrid();
    grid->attach(&plot);  // 网格必须附加到绘图才能显示

    // 3. 创建曲线
    QwtPlotCurve* curve = new QwtPlotCurve();
    curve->setTitle("Some Points");                            // 曲线标题(显示在图例中)
    curve->setPen(Qt::blue, 4);                                // 设置线条颜色和宽度
    curve->setRenderHint(QwtPlotItem::RenderAntialiased, true); // 抗锯齿

    // 4. 设置曲线符号
    QwtSymbol* symbol = new QwtSymbol(
        QwtSymbol::Ellipse,      // 符号形状:椭圆
        QBrush(Qt::yellow),      // 符号填充色
        QPen(Qt::red, 2),        // 符号边框
        QSize(8, 8)              // 符号大小
    );
    curve->setSymbol(symbol);

    // 5. 设置曲线数据
    QPolygonF points;
    points << QPointF(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();

    return app.exec();
}

代码解析

核心概念QwtPlot 是绘图的主容器,继承自 QFrame。一个 QwtPlot 可以包含多个绘图项(Plot Item),如曲线、网格、标记等,所有绘图项都需要通过 attach() 方法附加到 QwtPlot 才能显示。

基本使用流程:

  1. 创建 QwtPlot 对象 --- 设置标题、背景色、坐标轴范围
  2. 创建绘图项 --- 网格、曲线、标记等
  3. 设置绘图项属性和数据 --- 颜色、线宽、符号、数据点
  4. 附加到 QwtPlot --- 通过 attach() 方法
  5. 显示绘图 --- 调用 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 QVector<double>& x, const QVector<double>& 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) 说明
QwtPlotZoomer QwtPlotAxisZoomer 只能绑定 2 个坐标轴,更名为"轴缩放器"
- QwtPlotCanvasZoomer 新增:整体画布缩放器,不限轴数
QwtPanner QwtCachePanner 带缓存的平移器(原版行为)
QwtPlotPanner QwtPlotCachePanner 带缓存的绘图平移器(原版行为)
- QwtPlotPanner 新增:实时平移器,基于 QwtPicker

API 变更

  • QwtLinearColorMap::colorStop() 更名为 stopPos()
  • QwtLinearColorMap 新增 stopColors() 方法
  • QwtColorMap::rgb() 方法签名变更(v7.3.1+),已移至 core 模块

迁移提示

  1. 大部分 Qwt 6.x 代码可直接使用,仅需少量类名替换
  2. 如需使用原来的缓存式平移,将 QwtPanner 替换为 QwtCachePanner 即可
  3. 如需使用原来的缩放器,将 QwtPlotZoomer 替换为 QwtPlotAxisZoomer 即可
  4. Qt5.12+ 和 Qt6 完全兼容
  5. 网上常见的 Qwt3DPlot3D/Qwt3DSurfacePlot/Qwt3DFunction 写法是错误的 ,真实类名在类本身上省略了冗余的 Qwt3D 前缀,正确写法是 Qwt3D::Plot3DQwt3D::SurfacePlotQwt3D::Function

六、总结与系列预告

Qwt 7.0 是一次全面的现代化升级,核心改进可以用下表概括:

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

相比原版 Qwt 6.x,Qwt 7.0 在保持 API 兼容的前提下,通过现代化的构建系统、2D/3D 一体化设计、丰富的交互功能和性能优化,成为了一个更现代、更强大、更易用的 Qt 数据可视化库。LGPL 协议也使其成为商业应用的理想选择。

系列预告

本系列后续文章将深入讲解 Qwt 7.0 的各个方面:

敬请关注!


相关链接

相关推荐
初阳7853 小时前
【Qt】系统相关(3)——多线程
qt
初阳7856 小时前
【Qt】系统相关(2)——文件
开发语言·qt
柳杉7 小时前
别再手写大屏了!用这套「3D 地图 + 拖拽脚手架」示例源码,交付效率提升 80%
前端·three.js·数据可视化
尘中远20 小时前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia1 天前
Qt——多线程间的互斥
开发语言·qt
尘中远1 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
尘中远1 天前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图
sycmancia1 天前
Qt——进程与线程的概念
qt
郝学胜-神的一滴1 天前
Qt 高级编程 034:深耕QWidget底层内核—彻底吃透无边框窗口设计核心原理
开发语言·c++·qt·程序人生·软件开发·用户界面