QCustomPlot 核心功能与图表设置(上)——基础样式定制
QCustomPlot 核心功能与图表设置(上)——基础样式定制
在掌握了 QCustomPlot 的环境搭建与基本绘图之后,下一步就是让图表“看起来更专业”。无论是用于科研论文、工程监控还是商业展示,图表的视觉表现力都至关重要。QCustomPlot 提供了丰富的 API 来定制图表的每一个细节。
本文将聚焦于基础样式定制,涵盖坐标轴、标题、图例、网格、背景以及数据点样式的设置,助你打造美观、清晰、专业的可视化图表。
1. 坐标轴设置(一):轴标签、刻度范围与刻度间隔的自定义
QCustomPlot 默认会自动计算坐标轴范围和刻度,但在实际应用中,我们往往需要手动控制。
设置坐标轴范围
plot->xAxis->setRange(-5, 5); // X 轴范围 [-5, 5]
plot->yAxis->setRange(0, 100); // Y 轴范围 [0, 100]
设置刻度间隔(Tick Step)
plot->xAxis->setTickStep(1.0); // X 轴每 1 个单位一个主刻度
plot->yAxis->setTickStep(10.0); // Y 轴每 10 个单位一个主刻度
⚠️ 注意:
setTickStep()
在较新版本中可能被弃用,推荐使用setAutoTickStep(false)
+setTickStep()
或直接使用setTicker()
。
使用 QCPAxisTicker 自定义刻度(推荐方式)
QSharedPointer<QCPAxisTicker> ticker(new QCPAxisTicker);
ticker->setTickCount(6); // 设置主刻度数量(约)
plot->xAxis->setTicker(ticker);
对于更精细控制(如固定间隔),可使用 QCPAxisTickerFixed
:
QSharedPointer<QCPAxisTickerFixed> fixedTicker(new QCPAxisTickerFixed);
fixedTicker->setTickStep(2.0); // 每 2 个单位一个刻度
plot->xAxis->setTicker(fixedTicker);
设置轴标签(数值标签)格式
plot->yAxis->setLabel("温度 (°C)");
plot->xAxis->setNumberFormat("f"); // 固定小数
plot->xAxis->setNumberPrecision(1); // 保留 1 位小数
2. 坐标轴设置(二):轴标题样式、字体、颜色与位置调整
除了数值刻度,坐标轴的标题(Label)也需要美化。
设置轴标题文本
plot->xAxis->setLabel("时间 (s)");
plot->yAxis->setLabel("电压 (V)");
自定义标题字体与颜色
QFont axisFont("Microsoft YaHei", 10, QFont::Bold);
QColor axisColor(Qt::darkGray);plot->xAxis->setLabelFont(axisFont);
plot->xAxis->setLabelColor(axisColor);plot->yAxis->setLabelFont(axisFont);
plot->yAxis->setLabelColor(Qt::blue);
调整标题位置(偏移)
plot->xAxis->setLabelPadding(10); // 标题与刻度之间的间距(像素)
plot->yAxis->setLabelPadding(15);
默认情况下,X 轴标题在底部,Y 轴在左侧。如需更改轴位置(如 Y 轴放右侧),可使用:
plot->yAxis->setAxisRect()->setRangeDrag(Qt::Horizontal); plot->axisRect()->addAxis(QCPAxis::atRight); // 添加右侧 Y 轴
3. 图表标题与图例:添加、样式修改及图例位置优化
添加图表主标题
QCustomPlot 本身不直接提供“主标题”控件,但可通过 QCPTextElement
实现:
QCPTextElement *title = new QCPTextElement(plot, "传感器数据趋势图", QFont("Arial", 14, QFont::Bold));
plot->plotLayout()->insertRow(0); // 在顶部插入一行
plot->plotLayout()->addElement(0, 0, title);
启用并配置图例(Legend)
plot->legend->setVisible(true);
plot->legend->setFont(QFont("SimSun", 9));
plot->legend->setTextColor(Qt::black);
设置图例位置
图例位置由布局管理器控制,常用方式:
// 放在右上角(内嵌)
plot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignTop | Qt::AlignRight);// 或使用 plotLayout 调整(适用于多图)
plot->plotLayout()->addElement(1, 1, plot->legend);
更简洁的方式(推荐):
plot->legend->setBrush(QColor(255, 255, 255, 200)); // 半透明白色背景
plot->legend->setBorderPen(QPen(Qt::black));
plot->legend->setPadding(5);
plot->legend->setSelectableParts(QCPLegend::spItems); // 允许点击图例项
为图例项命名
绘图时指定名称,图例自动显示:
plot->addGraph();
plot->graph(0)->setName("通道 A");
plot->graph(0)->setData(x, y);
4. 网格与背景:网格线显示/隐藏、背景色与渐变背景设置
显示/隐藏网格线
plot->xAxis->grid()->setVisible(true);
plot->yAxis->grid()->setVisible(true);// 设置网格线样式
plot->xAxis->grid()->setPen(QPen(QColor(190, 190, 190), 1, Qt::DotLine));
plot->yAxis->grid()->setSubGridVisible(false); // 隐藏次级网格
设置图表背景色
plot->setBackground(Qt::white); // 纯色背景
设置渐变背景(高级)
QLinearGradient gradient(0, 0, 0, plot->height());
gradient.setColorAt(0, QColor(240, 240, 255));
gradient.setColorAt(1, QColor(255, 255, 255));
plot->setBackground(QBrush(gradient));
注意:渐变背景需在窗口大小变化时重新计算,建议在
resizeEvent
中更新。
5. 数据点样式:折线图/散点图的标记形状、大小与颜色定制
QCustomPlot 中,每条曲线(QCPGraph
)可独立设置线型、点型、颜色等。
设置折线样式
plot->graph(0)->setPen(QPen(Qt::red, 2)); // 红色,线宽 2
plot->graph(0)->setLineStyle(QCPGraph::lsLine); // 折线(默认)
启用数据点标记(Scatter)
plot->graph(0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, Qt::blue, 6) // 圆形,蓝色,直径 6px
);
常用标记形状
枚举值 | 说明 |
---|---|
ssNone | 无标记 |
ssDot | 小圆点 |
ssCircle | 空心圆 |
ssDisc | 实心圆 |
ssSquare | 正方形 |
ssDiamond | 菱形 |
ssCross | 十字 |
ssPlus | 加号 |
混合样式:线 + 点
plot->graph(0)->setLineStyle(QCPGraph::lsLine);
plot->graph(0)->setScatterStyle(QCPScatterStyle::ssCircle);
高级:自定义标记(如三角形)
QPolygonF triangle;
triangle << QPointF(-3, -2) << QPointF(3, -2) << QPointF(0, 3);
plot->graph(0)->setScatterStyle(QCPScatterStyle(triangle, Qt::green, 8));
小结
通过以上五个方面的设置,可以对 QCustomPlot 图表进行全方位的基础美化:
- 精确控制坐标轴范围与刻度;
- 定制轴标题的字体、颜色与间距;
- 添加专业标题与可交互图例;
- 配置网格与背景提升可读性;
- 个性化数据点样式增强视觉表现。
这些功能组合使用,足以应对大多数工程与科研场景的图表需求。
提示:所有样式修改后,记得调用
plot->replot()
刷新界面(在交互式更新时尤其重要)。
在下篇《QCustomPlot 核心功能与图表设置(下)》中,我们将深入探讨多图层、双 Y 轴、实时数据流、交互操作与导出图像等高级主题,敬请期待!
附:完整示例项目建议结构
MyPlotProject/
├── main.cpp
├── qcustomplot.h
├── qcustomplot.cpp
└── styles_demo.pro