坐标轴QCPAxis
一、QCPAxis 概述
QCPAxis 是 QCustomPlot 中负责坐标轴显示的类,控制坐标轴的绘制、刻度、标签和网格线等元素。
二、主要属性
属性 | 类型 | 描述 |
---|---|---|
range | QCPRange | 当前显示的轴范围 |
label | QString | 轴标签文本 |
labelFont | QFont | 轴标签字体 |
ticker | QSharedPointer<QCPAxisTicker> | 刻度生成器 |
grid | QCPGrid* | 网格线对象 |
basePen | QPen | 轴线画笔 |
tickPen | QPen | 刻度线画笔 |
subTickPen | QPen | 子刻度线画笔 |
tickLabels | bool | 是否显示刻度标签 |
tickLabelFont | QFont | 刻度标签字体 |
tickLabelRotation | double | 刻度标签旋转角度(度) |
numberFormat | QString | 数字格式(如"gb") |
numberPrecision | int | 数字精度 |
visible | bool | 是否可见 |
三、常用方法
1. 范围控制方法
方法 | 参数 | 描述 |
---|---|---|
setRange | const QCPRange &range | 设置轴范围 |
setRange | double lower, double upper | 设置轴范围 |
rescale | bool onlyVisiblePlottables | 根据数据自动调整范围 |
scaleRange | double factor, double center | 缩放范围 |
moveRange | double diff | 平移范围 |
2. 刻度设置方法
方法 | 参数 | 描述 |
---|---|---|
setTicker | QSharedPointer<QCPAxisTicker> ticker | 设置刻度生成器 |
setTickLabels | bool show | 显示/隐藏刻度标签 |
setTickLabelFont | const QFont &font | 设置刻度标签字体 |
setTickLabelRotation | double degrees | 设置标签旋转角度 |
setTickLength | int inside, int outside | 设置刻度线长度 |
setSubTickLength | int inside, int outside | 设置子刻度线长度 |
3. 样式设置方法
方法 | 参数 | 描述 |
---|---|---|
setLabel | const QString &text | 设置轴标签 |
setLabelFont | const QFont &font | 设置轴标签字体 |
setLabelColor | const QColor &color | 设置轴标签颜色 |
setBasePen | const QPen &pen | 设置轴线画笔 |
setTickPen | const QPen &pen | 设置刻度线画笔 |
setSubTickPen | const QPen &pen | 设置子刻度线画笔 |
四、信号列表
信号 | 参数 | 描述 |
---|---|---|
rangeChanged | const QCPRange &newRange | 范围改变时触发 |
scaleTypeChanged | QCPAxis::ScaleType scaleType | 比例类型改变时触发 |
selectionChanged | const QCPAxis::SelectableParts &parts | 选择状态改变时触发 |
五、枚举类型
1. AxisType 轴类型
值 | 描述 |
---|---|
atLeft | 左侧Y轴 |
atRight | 右侧Y轴 |
atTop | 顶部X轴 |
atBottom | 底部X轴 |
2. ScaleType 比例类型
值 | 描述 |
---|---|
stLinear | 线性比例 |
stLogarithmic | 对数比例 |
六、基础使用示例
cpp
// 获取底部X轴
QCPAxis *xAxis = customPlot->xAxis;// 设置轴范围
xAxis->setRange(0, 10);// 设置轴标签
xAxis->setLabel("时间 (s)");
xAxis->setLabelFont(QFont("Arial", 12));// 设置刻度
xAxis->setTickLength(5, 3); // 主刻度5px向外,3px向内
xAxis->setSubTickLength(2, 1); // 子刻度2px向外,1px向内
xAxis->setTickLabelFont(QFont("Arial", 9));
xAxis->setTickLabelRotation(45); // 刻度标签旋转45度// 设置网格线
xAxis->grid()->setPen(QPen(QColor(200, 200, 200), 1, Qt::DotLine));// 使用日期时间刻度
QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
dateTicker->setDateTimeFormat("hh:mm:ss\nyyyy-MM-dd");
xAxis->setTicker(dateTicker);
七、高级功能示例
1. 对数坐标轴
cpp
// 设置对数坐标
customPlot->yAxis->setScaleType(QCPAxis::stLogarithmic);// 自定义对数刻度
QSharedPointer<QCPAxisTickerLog> logTicker(new QCPAxisTickerLog);
logTicker->setLogBase(10);
logTicker->setSubTickCount(8);
customPlot->yAxis->setTicker(logTicker);// 设置标签格式
customPlot->yAxis->setNumberFormat("eb"); // 科学计数法
customPlot->yAxis->setNumberPrecision(0); // 无小数位
2. 多轴系统
cpp
// 创建右侧Y轴
QCPAxis *rightAxis = customPlot->axisRect()->addAxis(QCPAxis::atRight);
rightAxis->setLabel("温度 (°C)");// 将图形关联到右侧轴
QCPGraph *tempGraph = customPlot->addGraph(customPlot->xAxis, rightAxis);// 设置不同轴的范围
customPlot->yAxis->setRange(0, 100); // 左侧轴
rightAxis->setRange(0, 50); // 右侧轴
3. 自定义刻度标签
cpp
// 创建自定义刻度生成器
class CustomTicker : public QCPAxisTicker {
public:virtual QString getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) override{// 特殊标记某些刻度if (qFuzzyCompare(tick, 0.0))return "零";else if (qFuzzyCompare(tick, 5.0))return "五";elsereturn QCPAxisTicker::getTickLabel(tick, locale, formatChar, precision);}
};// 使用自定义刻度
QSharedPointer<CustomTicker> customTicker(new CustomTicker);
customPlot->xAxis->setTicker(customTicker);
八、性能优化技巧
-
限制刻度数量:
cpp
QSharedPointer<QCPAxisTickerFixed> fixedTicker(new QCPAxisTickerFixed); fixedTicker->setTickCount(5); // 只显示5个主刻度 xAxis->setTicker(fixedTicker);
-
简化标签绘制:
cpp
xAxis->setTickLabels(false); // 完全隐藏标签 // 或 xAxis->setTickLabelRotation(0); // 避免旋转标签(更快)
-
优化网格线:
cpp
xAxis->grid()->setZeroLinePen(Qt::NoPen); // 隐藏零线 xAxis->grid()->setSubGridVisible(false); // 隐藏子网格
QCPAxis 提供了高度可定制的坐标轴系统,可以满足各种复杂图表的需求。通过合理配置,可以创建出专业级的科学图表和商业可视化效果。