跳转至

网格线 - QwtPlotGrid

QwtPlotGrid 是用于在绘图画布上绘制坐标网格的绘图项。网格线帮助用户更准确地读取数据点的坐标值,是科学图表中常见的辅助元素。

主要功能特性

特性

  • 主/次网格线:支持主要刻度和次要刻度两种网格线
  • 独立控制X/Y轴:可分别启用或禁用水平和垂直网格
  • 样式自定义:主网格和次网格可设置不同的颜色、线宽和线型
  • 自动跟随刻度:网格线位置自动跟随坐标轴刻度划分

基本概念

网格线类型

QwtPlotGrid 支持四种网格线类型:

类型 说明
X轴主网格 垂直线条,位于X轴主要刻度位置
X轴次网格 垂直线条,位于X轴次要刻度位置
Y轴主网格 水平线条,位于Y轴主要刻度位置
Y轴次网格 水平线条,位于Y轴次要刻度位置

网格结构示意

1
2
3
4
5
6
    │    │    │    │    │    │  ← Y轴主网格(实线)
    │ ·  │ ·  │ ·  │ ·  │ ·  │  ← Y轴次网格(虚线)
────┼────┼────┼────┼────┼────┼── ← X轴主网格(实线)
    │ ·  │ ·  │ ·  │ ·  │ ·  │  ← X轴次网格(虚线)
    │    │    │    │    │    │
   0   2   4   6   8   10  12   ← X轴刻度

类关系

classDiagram
    class QwtPlotItem {
        +attach(plot)
        +detach()
        +setZ(z)
        +rtti()
    }

    class QwtPlotGrid {
        +enableX(bool)
        +enableY(bool)
        +enableXMin(bool)
        +enableYMin(bool)
        +setMajorPen(pen)
        +setMinorPen(pen)
        +setXDiv(scaleDiv)
        +setYDiv(scaleDiv)
    }

    QwtPlotItem <|-- QwtPlotGrid

使用方法

1. 基本使用

创建并添加网格到绘图:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <QwtPlot>
#include <QwtPlotGrid>

QwtPlot* plot = new QwtPlot();
plot->setCanvasBackground(Qt::white);

// 创建网格
QwtPlotGrid* grid = new QwtPlotGrid();

// 启用所有网格线(默认已启用)
grid->enableX(true);      // X轴主网格
grid->enableY(true);      // Y轴主网格
grid->enableXMin(false);  // X轴次网格(默认关闭)
grid->enableYMin(false);  // Y轴次网格(默认关闭)

// 附加到绘图
grid->attach(plot);

// 网格会自动跟随坐标轴刻度
plot->replot();

网格层级

网格通常应绘制在其他绘图项下方。默认情况下,QwtPlotGrid 的 Z 值较低,会先绘制。如需调整,使用 grid->setZ(-10) 等方法。

2. 网格线样式配置

设置主网格样式

1
2
3
4
5
6
7
8
9
// 使用颜色和宽度快速设置
grid->setMajorPen(Qt::gray, 0.0, Qt::DotLine);

// 使用QPen详细设置
QPen majorPen(Qt::darkGray, 1.0, Qt::SolidLine);
grid->setMajorPen(majorPen);

// 获取当前主网格画笔
const QPen& pen = grid->majorPen();

设置次网格样式

次网格线通常比主网格线更细或使用虚线:

1
2
3
4
5
6
// 设置次网格样式
grid->setMinorPen(Qt::lightGray, 0.5, Qt::DotLine);

// 或者使用QPen
QPen minorPen(QColor(200, 200, 200), 0.5, Qt::DashLine);
grid->setMinorPen(minorPen);

统一设置所有网格线

1
2
// 同时设置主网格和次网格样式
grid->setPen(Qt::gray, 0.5, Qt::DotLine);

3. 启用/禁用特定网格线

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 仅启用水平网格线
grid->enableX(false);   // 禁用垂直网格
grid->enableY(true);    // 启用水平网格

// 启用次级刻度网格
grid->enableXMin(true);
grid->enableYMin(true);

// 检查网格线启用状态
bool xEnabled = grid->xEnabled();      // X轴主网格
bool yEnabled = grid->yEnabled();      // Y轴主网格
bool xMinEnabled = grid->xMinEnabled(); // X轴次网格
bool yMinEnabled = grid->yMinEnabled(); // Y轴次网格

4. 自定义刻度划分

网格线默认跟随坐标轴的刻度划分。你也可以手动指定刻度:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <QwtScaleDiv>

// 创建自定义刻度划分
QwtScaleDiv scaleDiv;
scaleDiv.setInterval(0.0, 100.0);  // 设置范围

// 设置主刻度位置
QList<double> majorTicks;
majorTicks << 0 << 25 << 50 << 75 << 100;
scaleDiv.setTicks(QwtScaleDiv::MajorTick, majorTicks);

// 设置次刻度位置
QList<double> minorTicks;
for (double v = 0; v <= 100; v += 5) {
    if (!majorTicks.contains(v))
        minorTicks << v;
}
scaleDiv.setTicks(QwtScaleDiv::MinorTick, minorTicks);

// 应用到网格
grid->setXDiv(scaleDiv);  // X轴使用自定义刻度
grid->setYDiv(scaleDiv);  // Y轴使用自定义刻度

// 获取当前刻度划分
const QwtScaleDiv& xDiv = grid->xScaleDiv();
const QwtScaleDiv& yDiv = grid->yScaleDiv();

刻度划分类型

QwtScaleDiv 支持三种刻度级别:
- MajorTick - 主刻度(数值标签显示)
- MinorTick - 次刻度(小刻度线)
- MediumTick - 中等刻度(介于主次之间)

完整示例

以下示例展示网格的完整配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <QwtPlot>
#include <QwtPlotGrid>
#include <QwtPlotCurve>
#include <QwtLegend>

// 创建绘图
QwtPlot* plot = new QwtPlot();
plot->setTitle("网格配置示例");
plot->setCanvasBackground(Qt::white);
plot->insertLegend(new QwtLegend());

// 创建并配置网格
QwtPlotGrid* grid = new QwtPlotGrid();
grid->enableX(true);       // 启用X轴主网格
grid->enableY(true);       // 启用Y轴主网格
grid->enableXMin(true);    // 启用X轴次网格
grid->enableYMin(true);    // 启用Y轴次网格

// 主网格使用灰色实线
grid->setMajorPen(QPen(QColor(150, 150, 150), 1.0, Qt::SolidLine));

// 次网格使用浅灰色虚线
grid->setMinorPen(QPen(QColor(200, 200, 200), 0.5, Qt::DotLine));

grid->attach(plot);

// 添加一条曲线以便观察网格效果
QwtPlotCurve* curve = new QwtPlotCurve("数据");
QPolygonF points;
for (int i = 0; i <= 100; i++) {
    double x = i;
    double y = 50 + 30 * std::sin(i * 0.1);
    points << QPointF(x, y);
}
curve->setSamples(points);
curve->setPen(QPen(Qt::blue, 2.0));
curve->attach(plot);

plot->setAxisScale(QwtAxis::XBottom, 0, 100);
plot->setAxisScale(QwtAxis::YLeft, 0, 100);
plot->replot();

核心方法总结

方法 说明
enableX(bool) 启用/禁用X轴主网格
enableY(bool) 启用/禁用Y轴主网格
enableXMin(bool) 启用/禁用X轴次网格
enableYMin(bool) 启用/禁用Y轴次网格
xEnabled() 检查X轴主网格状态
yEnabled() 检查Y轴主网格状态
xMinEnabled() 检查X轴次网格状态
yMinEnabled() 检查Y轴次网格状态
setMajorPen() 设置主网格画笔
setMinorPen() 设置次网格画笔
majorPen() 获取主网格画笔
minorPen() 获取次网格画笔
setPen() 统一设置所有网格画笔
setXDiv() 设置X轴刻度划分
setYDiv() 设置Y轴刻度划分
xScaleDiv() 获取X轴刻度划分
yScaleDiv() 获取Y轴刻度划分

线宽为0的特殊含义

在 Qt 中,线宽为 0 表示使用 " косметическая线宽 "(1像素宽度的快速绘制线)。对于网格线,使用 0.0 作为线宽可以获得最细的线条。

相关示例

  • 所有绘图示例都包含网格:examples/2D/ 目录