QCPAxis、QCPGrid 和 QCPAxisTicker 三者关系
在 QCustomPlot 中,QCPAxis、QCPGrid 和 QCPAxisTicker 三者协同工作,共同构成坐标轴系统的完整功能。它们的关系可以通过以下层次和交互来理解:
1. 核心关系
关键设计特点
-
单向依赖
-
QCPGrid
是QCPAxis
的成员,无法独立存在。 -
QCPAxisTicker
通过智能指针由QCPAxis
持有,但逻辑解耦(可自定义派生类)。
-
-
自动同步机制
-
修改
QCPAxis
的范围或样式时,关联的QCPGrid
和QCPAxisTicker
会自动响应(如重绘网格、重新计算刻度)。
-
-
扩展性
-
通过继承
QCPAxisTicker
可实现自定义刻度逻辑(如对数刻度、文本标签刻度等)。 -
QCPGrid
的样式完全由QCPAxis
控制,无需直接操作。
-
2. 分工与依赖关系
类 | 角色 | 依赖关系 | 典型访问方式 |
---|---|---|---|
QCPAxis | 坐标轴本体,管理范围、标签、样式 | 1. 持有 QCPGrid 对象2. 通过 setTicker() 绑定 QCPAxisTicker | customPlot->xAxis / yAxis |
QCPGrid | 绘制与坐标轴对齐的网格线 | 完全依附于 QCPAxis (不能独立存在) | axis->grid() |
QCPAxisTicker | 生成刻度和标签的逻辑 | 被 QCPAxis 持有(通过智能指针),可独立实现不同刻度策略 | axis->setTicker(shared_ptr) |
3. 交互流程示例
4. 协作流程示例
(1) 初始化坐标轴系统
cpp
// 创建主图
QCustomPlot *customPlot = new QCustomPlot;// 获取X轴并设置范围
QCPAxis *xAxis = customPlot->xAxis;
xAxis->setRange(0, 10);
xAxis->setLabel("时间轴");// 配置网格线(通过QCPAxis访问QCPGrid)
xAxis->grid()->setPen(QPen(Qt::gray, 1, Qt::DotLine)); // 虚线网格
xAxis->grid()->setSubGridVisible(true); // 显示子网格// 设置刻度生成器(QCPAxisTickerDateTime为派生类)
QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
dateTicker->setDateTimeFormat("hh:mm:ss");
xAxis->setTicker(dateTicker); // 绑定到X轴
(2) 动态交互
cpp
// 当坐标轴范围变化时,网格线和刻度自动同步更新
connect(xAxis, &QCPAxis::rangeChanged, [](const QCPRange &newRange) {qDebug() << "新范围:" << newRange.lower << "-" << newRange.upper;// QCPGrid会根据新范围重绘网格// QCPAxisTicker会重新生成刻度
});// 手动触发重新生成刻度(例如切换时间格式)
dateTicker->setDateTimeFormat("MM-dd");
customPlot->replot();