【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 的各个方面:

敬请关注!


相关链接

相关推荐
Quz20 小时前
QML 基础按钮:Button、RoundButton 与 DelayButton
qt
Quz20 小时前
QML ToolTip 组件:图标、多行文本与阴影
qt
xcyxiner21 小时前
DicomViewer14(读取图像按固定窗宽窗位显示)
qt
太平洋月光1 天前
Antv G2中自定义技巧📊
前端·数据可视化
马里马里奥-2 天前
从零搭建AI Agent工具链的技术文章大纲
开发语言·qt
Quz2 天前
QML 与 JavaScript 交互方式:内联函数、外部文件、信号槽与工作线程
javascript·qt
Quz2 天前
QML ToolTip 组件:延迟提示与自定义外观
qt
wWYy.2 天前
RPC详解
qt·rpc·php
Fu_Lin_2 天前
Qt嵌入式从零基础到精通(01):Qt嵌入式开发全景图:从桌面Qt到ARM Linux
linux·arm开发·qt·qt5·嵌入式linux
海清河晏1112 天前
Qt实战:从零构建美化登录界面
开发语言·c++·qt