【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图

【Qwt 7.0 系列】常用图表类型实战 ------ 柱状图、散点图、箱线图与直方图

本文是 Qwt 7.0 系列介绍和教程,如果你正在寻找一个高性能、协议友好、同时支持 2D 和 3D 绘图的 Qt 数据可视化库,那么这篇文章就是为你准备的。

系列总述文章:Qwt 7.0 ------ 基于 Qt 的高性能 2D/3D 绘图库

概述 | 高性能曲线绘制 | 常用图表类型 | 高级科学图表 | 多坐标轴与布局 | 交互功能 | 3D 数据可视化 | 坐标轴与刻度 | 控件与辅助元素 | 总体架构解析 | matplotlib 风格绘图

项目地址:GitHub | Gitee | 在线文档

在数据可视化的世界里,折线图只是开胃菜。真正让一个绘图库"好用"的,是它能不能优雅地处理柱状图、散点图、箱线图、直方图这些日常分析中最高频的图表类型。

本文是 Qwt 7.0 系列的第 3 篇,将带你逐一掌握 Qwt 7.0 中最常用的四种图表的实战用法。特别值得一提的是,箱线图(QwtPlotBoxChart)是 Qwt 7.2.0 才新增的功能,旧版本(包括原版 Qwt 6.x)完全没有这个类------如果你之前被"Qwt 没有箱线图"劝退过,现在是时候重新认识了。


一、引言:为什么图表类型很重要

Qwt 7.0 是基于原版 Qwt 6.2.0 的现代化维护分支,由社区持续更新。相比原版,它不仅修复了大量历史遗留问题,还在图表类型上做了重要扩展:

  • 柱状图接口增强 :7.0 对 QwtPlotBarChart 的 Pen/Brush 样式设置做了改进,定制更灵活
  • 新增箱线图 :7.2.0 起新增 QwtPlotBoxChart,填补了统计可视化的一大空白
  • 散点图性能优化:百万级数据点的散点图也能流畅渲染

下面我们逐一展开。


二、柱状图 QwtPlotBarChart

柱状图是分类数据对比分析的利器。Qwt 提供两个柱状图类:

类名 说明
QwtPlotBarChart 单组柱状图,每组一个柱体
QwtPlotMultiBarChart 多组柱状图,支持分组和堆叠模式

2.1 基本柱状图

先来看最简单的单组柱状图:

cpp 复制代码
#include <QwtPlot>
#include <QwtPlotBarChart>

QwtPlot* plot = new QwtPlot();
plot->setTitle("柱状图示例");
plot->setCanvasBackground(Qt::white);

// 创建柱状图
QwtPlotBarChart* barChart = new QwtPlotBarChart("销售数据");

// 设置数据(Y值列表,X自动为索引)
QVector<double> values;
values << 10 << 25 << 15 << 30 << 20;
barChart->setSamples(values);

// 设置柱体样式
barChart->setPen(QPen(Qt::darkBlue, 2));            // 边框
barChart->setBrush(QBrush(QColor(100, 150, 200)));  // 填充

// 设置基线(柱体起始位置)
barChart->setBaseline(0.0);  // 从0开始

barChart->attach(plot);
plot->replot();

代码逻辑很直观:创建 QwtPlotBarChart 对象,用 setSamples() 填数据,用 setPen() / setBrush() 设样式,最后 attach() 到 plot 上。

2.2 数据设置的三种方式

setSamples() 支持三种重载,灵活适配不同数据来源:

cpp 复制代码
// 方式1:仅Y值(X自动为0,1,2...)
QVector<double> yValues;
yValues << 10 << 20 << 30 << 40;
barChart->setSamples(yValues);

// 方式2:指定X和Y坐标
QVector<QPointF> points;
points << QPointF(1, 10) << QPointF(2, 25) << QPointF(3, 15);
barChart->setSamples(points);

// 方式3:使用QwtSeriesData(适合自定义数据源)
barChart->setSamples(seriesData);

2.3 分组柱状图与堆叠柱状图

当需要对比多组数据时,QwtPlotMultiBarChart 是主角。它支持两种模式:

模式 说明
Grouped 分组模式:多组数据并列显示,便于对比
Stacked 堆叠模式:多组数据叠加显示,便于看总量

分组模式适合横向对比各组数值,堆叠模式则更看重每组总量。代码实现如下:

cpp 复制代码
#include <QwtPlotMultiBarChart>

// 创建多组柱状图
QwtPlotMultiBarChart* multiBar = new QwtPlotMultiBarChart();
multiBar->setTitle("多组数据对比");

// 设置每组的标题(用于图例)
QList<QwtText> titles;
titles << QwtText("组A") << QwtText("组B") << QwtText("组C");
multiBar->setBarTitles(titles);

// 设置数据(每个样本包含多组值)
QVector<QwtSetSample> samples;
samples << QwtSetSample(0, QVector<double>() << 10 << 20 << 15);  // 第1个分类
samples << QwtSetSample(1, QVector<double>() << 25 << 15 << 30);  // 第2个分类
samples << QwtSetSample(2, QVector<double>() << 20 << 25 << 10);  // 第3个分类
multiBar->setSamples(samples);

// 设置显示模式
multiBar->setChartMode(QwtPlotMultiBarChart::Grouped);   // 分组模式
// multiBar->setChartMode(QwtPlotMultiBarChart::Stacked); // 堆叠模式

multiBar->attach(plot);
plot->replot();

2.4 样式定制:画笔、填充与符号

7.0 的接口增强

Qwt 7.0 对柱状图的样式设置做了增强。你可以直接用 setPen() / setBrush() 设置全局样式,也可以通过 QwtColumnSymbol 做更精细的控制:

cpp 复制代码
#include <QwtColumnSymbol>

// 创建柱体符号
QwtColumnSymbol* symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);
symbol->setFrameStyle(QwtColumnSymbol::Raised);  // 凸起边框样式
symbol->setPen(QPen(Qt::darkBlue, 1));            // 边框画笔
symbol->setBrush(QBrush(QColor(100, 150, 200, 180)));  // 半透明填充

barChart->setSymbol(symbol);

对于多组柱状图,可以给每组分配不同颜色的符号:

cpp 复制代码
// 为每组创建不同的符号
QList<QwtColumnSymbol*> symbols;
QColor colors[3] = {Qt::red, Qt::green, Qt::blue};
for (int i = 0; i < 3; i++) {
    QwtColumnSymbol* symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);
    symbol->setBrush(QBrush(colors[i]));
    symbol->setPen(QPen(Qt::black, 1));
    symbols.append(symbol);
}
multiBar->setSymbols(symbols);
柱体宽度与布局
cpp 复制代码
// 布局策略
barChart->setLayoutPolicy(QwtPlotAbstractBarChart::AutoAdjustSamples);
// 可选值:
// - FixedBarWidth: 固定像素宽度
// - FixedSampleWidth: 固定样本宽度(含间距)
// - AdjustSampleWidth: 根据可用空间调整

// 布局提示值(柱体宽度占样本空间的比例)
barChart->setLayoutHint(0.8);
显示方向
cpp 复制代码
barChart->setOrientation(Qt::Vertical);   // 垂直(默认)
barChart->setOrientation(Qt::Horizontal); // 水平

2.5 柱状图核心方法速查

方法 说明
setSamples() 设置数据
setSymbol() / setSymbols() 设置柱体符号
setPen() 设置边框画笔
setBrush() 设置填充画笔
setBaseline() 设置基线位置
setOrientation() 设置显示方向
setLayoutPolicy() 设置布局策略
setLayoutHint() 设置布局参数
setLegendMode() 设置图例模式
setChartMode() (MultiBar) 设置分组/堆叠模式

三、散点图:QwtPlotCurve 的散点模式

散点图用于展示数据的分布情况。Qwt 没有独立的"散点图类",而是通过 QwtPlotCurve 配合 QwtSymbol 来实现------这种设计很巧妙,因为散点图本质上就是"没有连线的曲线"。

3.1 三种实现方式

方式 曲线样式 说明
NoCurve + Symbol NoCurve 仅显示符号,无连线,最常用
Dots Dots 仅绘制像素点,性能最高
Lines + Symbol Lines 连线与符号同时显示

3.2 基本散点图

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

QwtPlot* plot = new QwtPlot();
plot->setTitle("散点图示例");
plot->setCanvasBackground(Qt::white);

// 创建散点曲线
QwtPlotCurve* scatter = new QwtPlotCurve("数据点");

// 关键:设置为无连线模式
scatter->setStyle(QwtPlotCurve::NoCurve);

// 创建符号
QwtSymbol* symbol = new QwtSymbol(
    QwtSymbol::Ellipse,     // 椭圆形
    QBrush(Qt::blue),       // 蓝色填充
    QPen(Qt::darkBlue, 1),  // 深蓝边框
    QSize(8, 8)             // 大小
);
scatter->setSymbol(symbol);

// 设置数据
QPolygonF points;
for (int i = 0; i < 100; i++) {
    double x = rand() % 100;
    double y = rand() % 100;
    points << QPointF(x, y);
}
scatter->setSamples(points);

scatter->attach(plot);
plot->replot();

核心就两步:setStyle(QwtPlotCurve::NoCurve) 关掉连线,setSymbol() 设置符号样式。

3.3 符号形状大全

Qwt 提供了丰富的内置符号形状:

形状 枚举值 说明
Ellipse 椭圆 最常用,圆形或椭圆
Rect 矩形 正方形或矩形
Diamond 菱形 菱形/钻石形
Triangle / UTriangle 三角形 向上三角形
DTriangle 倒三角 向下三角形
LTriangle / RTriangle 左/右三角 侧向三角形
Cross 十字 +形十字
XCross X十字 X形十字
Star1 / Star2 星形 六角星 / 五角星
Hexagon 六边形 正六边形
Path 路径 自定义 QPainterPath

如果内置形状不够用,可以用 Path 模式绘制自定义形状:

cpp 复制代码
#include <QPainterPath>

QPainterPath path;
path.moveTo(0, -10);
path.lineTo(8, 5);
path.lineTo(5, 5);
path.lineTo(0, 0);
path.lineTo(-5, 5);
path.lineTo(-8, 5);
path.closeSubpath();

QwtSymbol* customSymbol = new QwtSymbol();
customSymbol->setStyle(QwtSymbol::Path);
customSymbol->setPath(path);
customSymbol->setBrush(QBrush(Qt::red));
customSymbol->setPen(QPen(Qt::darkRed, 1));
customSymbol->setSize(20, 20);

scatter->setSymbol(customSymbol);

3.4 大数据散点图:性能关键

当数据点达到万级甚至百万级时,NoCurve + Symbol 方式会明显变慢,因为每个点都要绘制一个完整的符号对象。此时应切换到 Dots 样式:

cpp 复制代码
QwtPlotCurve* scatter = new QwtPlotCurve("大规模散点");

// 使用Dots样式 - 仅绘制像素点,性能最高
scatter->setStyle(QwtPlotCurve::Dots);

// 启用图像缓冲优化(进一步提速)
scatter->setPaintAttribute(QwtPlotCurve::ImageBuffer, true);

// 设置颜色(Dots样式不需要Symbol,直接用pen颜色)
scatter->setPen(Qt::blue);

// 生成100万个点
QVector<double> xData(1000000), yData(1000000);
for (int i = 0; i < 1000000; i++) {
    xData[i] = rand() % 1000;
    yData[i] = rand() % 1000;
}
scatter->setSamples(xData, yData);

scatter->attach(plot);

两种方式的性能对比:

数据量 NoCurve+Symbol Dots
<1000 点 最快
1000-10000 点 较快
>10000 点 较慢
>100000 点 很慢 最快(推荐)

经验法则 :数据量超过 1 万点,果断用 Dots

3.5 符号抖动

当多个数据点位置相近时,它们会重叠在一起。setSymbolJitter() 可以为每个点的 X 坐标添加随机偏移,使重叠点分散显示:

cpp 复制代码
// 设置5%的抖动范围
scatter->setSymbolJitter(0.05);

这在观察数据密度分布时特别有用。


四、箱线图 QwtPlotBoxChart(Qwt 7.2.0 新增)

这是本文的重头戏。 QwtPlotBoxChart 是 Qwt 7.2.0 才引入的全新图表类型,原版 Qwt 6.x 完全没有箱线图支持。如果你做统计分析、实验数据处理,这个类会让你省去大量手写绘制代码的工作。

4.1 什么是箱线图

箱线图(Box-and-Whisker Plot)通过五个关键数值(五数概括)来描述数据分布:

  • 最小值:下须须位置
  • Q1:第一四分位数(25% 分位)
  • 中位数:数据的中间值
  • Q3:第三四分位数(75% 分位)
  • 最大值:上须须位置

下图展示了标准箱线图的各个组成部分:

箱体(Q1 到 Q3)表示中间 50% 的数据,中位数线将箱体一分为二,须须延伸到数据的合理范围边界,超出须须的点则被标记为异常值。

4.2 核心数据结构

QwtBoxSample

每个箱子用一个 QwtBoxSample 表示:

cpp 复制代码
struct QwtBoxSample {
    double position;       // 箱子在位置轴上的坐标
    double whiskerLower;   // 下须须位置
    double q1;             // 第一四分位数(25%分位)
    double median;         // 中位数(50%分位)
    double q3;             // 第三四分位数(75%分位)
    double whiskerUpper;   // 上须须位置
    int outlierCount;      // 异常值数量(仅计数)
};

注意参数顺序 :构造函数为 position, whiskerLower, q1, median, q3, whiskerUpper,顺序搞错会导致箱线图显示异常。

QwtBoxOutlierSample

异常值数据与箱体数据分离存储:

cpp 复制代码
struct QwtBoxOutlierSample {
    double boxPosition;       // 对应箱子的位置
    QVector<double> values;   // 所有异常值列表
};

这种分离设计的好处是:异常值可以独立设置符号、颜色、大小,互不干扰。

4.3 基本使用:直接提供统计数据

如果你已经有了计算好的统计量,直接填入 QwtBoxSample 即可:

cpp 复制代码
#include <QwtPlotBoxChart>
#include <QwtLegend>

QwtPlot* plot = new QwtPlot();
plot->setTitle("箱线图示例");
plot->insertLegend(new QwtLegend());

// 创建箱线图
QwtPlotBoxChart* boxChart = new QwtPlotBoxChart("数据组A");
boxChart->attach(plot);

// 准备箱线图数据
// 参数顺序:位置, 下须, Q1, 中位数, Q3, 上须
QVector<QwtBoxSample> samples;
samples << QwtBoxSample(1.0, 10.0, 20.0, 35.0, 50.0, 60.0);
samples << QwtBoxSample(2.0, 15.0, 25.0, 40.0, 55.0, 70.0);
samples << QwtBoxSample(3.0, 8.0, 18.0, 32.0, 48.0, 58.0);

boxChart->setSamples(samples);

// 设置样式
boxChart->setBrush(QColor(100, 150, 200, 150));  // 半透明蓝色填充
boxChart->setPen(QPen(Qt::darkBlue, 2.0));        // 深蓝色边框
boxChart->setBoxExtent(0.35);                     // 箱体宽度

plot->replot();

4.4 从原始数据自动计算

更常见的场景是:你只有一堆原始数据,需要自动计算统计量。这时用 QwtBoxStatisticsCalculator

cpp 复制代码
#include <qwt_box_statistics.h>
#include <QwtSymbol>

// 准备原始数据
QVector<double> rawData;
for (int i = 0; i < 100; i++) {
    rawData << 50.0 + (rand() % 50) - 25.0;
}
// 添加极端值作为异常值
rawData << 5.0;
rawData << 100.0;

// 计算箱线图统计量
QwtBoxSample sample;
QwtBoxOutlierSample outlier;

// calculateFull 一次性计算所有数据
QwtBoxStatisticsCalculator::calculateFull(
    1.5,              // 箱子位置
    rawData,          // 原始数据
    sample,           // 输出:统计结果
    outlier,          // 输出:异常值
    QwtBoxStatisticsCalculator::Tukey,  // 计算方法
    1.5               // IQR系数
);

// 设置到箱线图
QwtPlotBoxChart* boxChart = new QwtPlotBoxChart("自动计算");
boxChart->attach(plot);

QVector<QwtBoxSample> samples;
samples << sample;
boxChart->setSamples(samples);

QVector<QwtBoxOutlierSample> outliers;
outliers << outlier;
boxChart->setOutliers(outliers);

// 配置异常值样式
QwtSymbol* outlierSymbol = new QwtSymbol(QwtSymbol::Diamond);
outlierSymbol->setSize(8, 8);
outlierSymbol->setBrush(Qt::red);
outlierSymbol->setPen(QPen(Qt::darkRed, 1));
boxChart->setOutlierSymbol(outlierSymbol);

// 启用抖动避免异常值重叠
boxChart->setOutlierJitter(0.1);

4.5 五种须须计算方法

须须(Whisker)的端点位置怎么算?Qwt 提供了五种方法:

计算方法 适用场景 说明
Tukey 标准箱线图 1.5×IQR 确定须须范围,经典异常值检测
Percentile 自定义范围 指定百分位(如第5和第95百分位)作为端点
MinMax 完整数据范围 须须延伸到最小值和最大值,不显示异常值
StandardDeviation 正态分布数据 均值 ± n×标准差
StandardError 统计推断 均值 ± n×标准误

选择建议

  • 一般数据分析:用 Tukey(默认)
  • 自定义异常标准:用 Percentile 或调整 Tukey 系数
  • 展示完整分布:用 MinMax
  • 正态分布检验:用 StandardDeviation

4.6 三种箱体样式

cpp 复制代码
// 矩形箱体(默认)- 最常用
boxChart->setBoxStyle(QwtPlotBoxChart::Rect);

// 菱形箱体 - 强调数据分布对称性
boxChart->setBoxStyle(QwtPlotBoxChart::Diamond);

// 缺口箱体 - 显示中位数置信区间
boxChart->setBoxStyle(QwtPlotBoxChart::Notch);
样式 特点
Rect 标准样式,适合大多数场景
Diamond 适合对比多组数据分布的对称性
Notch 缺口表示中位数置信区间,两组缺口不重叠则中位数显著不同

4.7 方向切换

cpp 复制代码
// 垂直方向(默认)
boxChart->setOrientation(Qt::Vertical);

// 水平方向
boxChart->setOrientation(Qt::Horizontal);

切换方向后记得刷新坐标轴:

cpp 复制代码
boxChart->setOrientation(Qt::Horizontal);
plot->setAxisAutoScale(QwtAxis::XBottom);
plot->setAxisAutoScale(QwtAxis::YLeft);
plot->replot();

五、直方图 QwtPlotHistogram

直方图和柱状图长得很像,但本质不同:柱状图的 X 轴是分类标签,直方图的 X 轴是连续数值区间。直方图常用于展示数据分布频率。

5.1 直方图 vs 柱状图

特性 柱状图 (BarChart) 直方图 (Histogram)
数据结构 点值 (x, y) 区间值 (x1, x2, y)
柱体宽度 固定或可调 由区间决定
适用场景 分类数据对比 连续数据分布
X轴含义 分类标签 数值区间

5.2 基本直方图

直方图的数据结构是 QwtIntervalSample,每个样本包含一个区间和一个值:

cpp 复制代码
#include <QwtPlot>
#include <QwtPlotHistogram>
#include <QwtInterval>

QwtPlot* plot = new QwtPlot();
plot->setTitle("直方图示例");
plot->setCanvasBackground(Qt::white);

// 创建直方图
QwtPlotHistogram* histogram = new QwtPlotHistogram("数据分布");
histogram->setStyle(QwtPlotHistogram::Columns);  // 柱状样式(默认)

// 准备区间数据
QVector<QwtIntervalSample> samples;
samples << QwtIntervalSample(10, QwtInterval(0, 10));    // [0,10] 区间,值=10
samples << QwtIntervalSample(25, QwtInterval(10, 20));   // [10,20] 区间,值=25
samples << QwtIntervalSample(15, QwtInterval(20, 30));   // [20,30] 区间,值=15
samples << QwtIntervalSample(30, QwtInterval(30, 40));   // [30,40] 区间,值=30
histogram->setSamples(samples);

// 设置样式
histogram->setPen(QPen(Qt::darkBlue, 1));
histogram->setBrush(QBrush(QColor(100, 150, 200)));

histogram->attach(plot);
plot->replot();

5.3 三种显示样式

cpp 复制代码
// 柱状样式(默认)- 每个区间独立柱体
histogram->setStyle(QwtPlotHistogram::Columns);

// 轮廓样式 - 整体轮廓填充
histogram->setStyle(QwtPlotHistogram::Outline);

// 线条样式 - 仅绘制水平线条
histogram->setStyle(QwtPlotHistogram::Lines);

轮廓样式注意Outline 样式要求区间按递增顺序排列且不重叠,否则绘制结果异常。

5.4 柱体符号与渐变填充

和柱状图一样,直方图也可以用 QwtColumnSymbol 定制柱体外观,包括渐变填充:

cpp 复制代码
#include <QwtColumnSymbol>

QwtColumnSymbol* symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);
symbol->setFrameStyle(QwtColumnSymbol::Plain);

// 渐变填充
QLinearGradient gradient(0, 0, 0, 1);
gradient.setColorAt(0, Qt::blue);
gradient.setColorAt(1, Qt::darkBlue);
symbol->setBrush(QBrush(gradient));

symbol->setPen(QPen(Qt::black, 1));
histogram->setSymbol(symbol);

5.5 从原始数据生成统计直方图

实际应用中,通常是从一堆原始数据出发,先分箱统计再绘制:

cpp 复制代码
// 原始数据
QVector<double> rawData;
for (int i = 0; i < 1000; i++) {
    rawData << (rand() % 100);  // 0-99 随机数
}

// 分箱统计
int binCount = 10;
double minVal = 0, maxVal = 100;
double binWidth = (maxVal - minVal) / binCount;

QVector<QwtIntervalSample> samples(binCount);
for (int i = 0; i < binCount; i++) {
    double binMin = minVal + i * binWidth;
    double binMax = binMin + binWidth;

    int count = 0;
    for (double val : rawData) {
        if (val >= binMin && val < binMax) {
            count++;
        }
    }
    samples[i] = QwtIntervalSample(count, QwtInterval(binMin, binMax));
}

histogram->setSamples(samples);

5.6 QwtInterval 区间类

QwtInterval 表示数值区间,支持边界条件设置:

cpp 复制代码
#include <QwtInterval>

QwtInterval interval(0, 100);

// 包含两端 [0, 100]
interval.setBorderFlags(QwtInterval::IncludeMinimum |
                        QwtInterval::IncludeMaximum);

// 排除两端 (0, 100)
interval.setBorderFlags(QwtInterval::ExcludeMinimum |
                        QwtInterval::ExcludeMaximum);

// 常用方法
double width = interval.width();       // 区间宽度
double min = interval.minValue();      // 最小值
double max = interval.maxValue();      // 最大值
bool contains = interval.contains(50); // 是否包含某值

六、与旧版本的区别

如果你从原版 Qwt 6.x 迁移到 7.0,需要特别注意以下变化:

特性 原版 Qwt 6.x Qwt 7.0+
箱线图 不支持 7.2.0 新增 QwtPlotBoxChart
柱状图 Pen/Brush 接口有限 7.0 增强,定制更灵活
箱线图统计计算 内置 QwtBoxStatisticsCalculator,支持 5 种须须计算方法
异常值检测 自动检测,支持自定义符号和抖动
散点图 基础支持 性能优化,支持百万级数据点
多组柱状图 支持 支持,接口更完善

核心结论:箱线图是 7.0 系列最重要的新增图表类型,如果你有统计分析需求,升级到 7.2.0+ 是值得的。


七、总结与下一篇文章预告

本文介绍了 Qwt 7.0 中四种最常用的图表类型:

  1. 柱状图QwtPlotBarChart / QwtPlotMultiBarChart):支持分组、堆叠、丰富的样式定制,7.0 增强了 Pen/Brush 接口
  2. 散点图QwtPlotCurve 散点模式):通过 NoCurve + SymbolDots 实现,百万级数据也能流畅渲染
  3. 箱线图QwtPlotBoxChart):7.2.0 新增,内置统计计算器,支持 5 种须须计算方法和 3 种箱体样式
  4. 直方图QwtPlotHistogram):基于区间数据结构,支持柱状、轮廓、线条三种样式

选型建议

  • 分类数据对比 → 柱状图
  • 数据分布观察 → 散点图
  • 统计分布分析 → 箱线图
  • 频率分布展示 → 直方图

系列文章

系列总述:Qwt 7.0 ------ 基于 Qt 的高性能 2D/3D 绘图库


相关链接

相关推荐
尘中远2 小时前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图
sycmancia2 小时前
Qt——进程与线程的概念
qt
郝学胜-神的一滴3 小时前
Qt 高级编程 034:深耕QWidget底层内核—彻底吃透无边框窗口设计核心原理
开发语言·c++·qt·程序人生·软件开发·用户界面
满天星83035774 小时前
【Qt】控件(二) (geometry及与frameGeometry的区别)
开发语言·qt
大气的小蜜蜂4 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·qt·sqlite
尘中远4 小时前
【Qwt 7.0 系列】总体架构解析 —— 从单体到三库模块化的演进
qt·matplotlib·绘图·qwt·科学绘图
xcyxiner4 小时前
DicomViewer (编译以及优化)8
qt
旖-旎4 小时前
QT界面优化(6)
开发语言·c++·qt
特立独行的猫a5 小时前
为 HarmonyOS/OpenHarmony 构建第三方库的解决方案(转自Qt官方Blog)
qt·华为·harmonyos·三方库·鸿蒙pc