关于QcustomPlot 的概念就不多赘述了。这篇摘记主要记录我处理多个坐标系(QCPAxisRect)在同一个QcustomPlot::Plotlayout中垂直布局的情况下,当坐标轴范围收缩调整的时候使得多条Y轴总能对齐的方法.
进入正题:
/* 一、构建多个坐标系,并按行插入布局。 */
for (int i = 0; i < 10 - 1; i++)
{
QCPAxisRect *axisRect = new QCPAxisRect(ui->customplot, true);
// 下面这两行使得Y轴轴线总是对齐
axisRect->setAutoMargins(QCP::MarginSide::msLeft | QCP::MarginSide::msRight);
axisRect->setMarginGroup(QCP::msLeft | QCP::MarginSide::msRight, m_customplot_st.msGroup);
// add common X-axis to rect
axisRect->axes().append(m_customplot_st.common_axisRect->axis(QCPAxis::atBottom));
foreach (auto axis, axisRect->axes())
{
axis->setLayer("axes");
}
// set Y-axis properties
QCPAxis *axis_Y = axisRect->axis(QCPAxis::atLeft);
axis_Y->setRange(m_customplot_st.axisY_map.value(item->text())->range());
axis_Y->setBasePen(m_customplot_st.axisY_map.value(item->text())->basePen());
axis_Y->grid()->setVisible(false);
axis_Y->setObjectName(item->text());
// set yAxis label
axis_Y->setPadding(20);
QCPItemText* label = setYaxisLabel(axis_Y, m_customplot_st.axisY_map.value(item->text())->label(), axisRect);
// update/insert map
m_customplot_st.yAxisLable_map[item->text()] = label;
// set X-axis properties
QCPAxis *axis_X = axisRect->axis(QCPAxis::atBottom);
axis_X->setTicks(false);
axis_X->grid()->setVisible(false);
axis_X->setRange(m_customplot_st.common_axisRect->axis(QCPAxis::atBottom)->range());
connect(axis_X, SIGNAL(rangeChanged(QCPRange)), this, SLOT(slot_XaxisRangeChanged(QCPRange)));
// bind newly Y-axis to graph
m_customplot_st.graphs.value(item->text())->setValueAxis(axis_Y);
// bind newly X-axis to graph
m_customplot_st.graphs.value(item->text())->setKeyAxis(axis_X);
// add axisRect to element
ui->customplot->plotLayout()->addElement(i, 0, axisRect);
// update signal to axes map
m_customplot_st.axisX_map[item->text()] = axis_X;
m_customplot_st.axisY_map[item->text()] = axis_Y;
// map signal to axisRect
m_customplot_st.signalToAxisRectMap[item->text()] = axisRect;
}
/* 上面代码使得Y轴轴线始终对齐,下面的代码使得Y轴的标签始终对齐 */
QCPItemText *DataAquisition::setYaxisLabel(QCPAxis *yAxis, QString label, QCPAxisRect *rect)
{
QCPItemText* yAxisLabel = new QCPItemText(ui->customplot);
yAxisLabel->setText(label);
yAxisLabel->setRotation(90);
yAxisLabel->position->setAxisRect(rect);
yAxisLabel->setClipToAxisRect(false);
//x is absolut position
yAxisLabel->position->setTypeX(QCPItemPosition::ptAbsolute);
//y is relativ to AxesRect
yAxisLabel->position->setTypeY(QCPItemPosition::ptAxisRectRatio);
yAxisLabel->position->setAxes(0, yAxis);
yAxisLabel->position->setCoords(10, 0.5);
return yAxisLabel;
}