QCustomPlot 坐标轴范围随折线变化
时间: 2023-08-08 16:13:25 浏览: 145
利用qcustomplot画出对应的折线图和柱状图
您可以使用QCustomPlot的信号`QCPAxis::rangeChanged`来实现坐标轴范围随折线变化。该信号在坐标轴范围发生变化时发出,您可以在槽函数中根据折线的范围来更新坐标轴的范围。
以下是一个示例代码:
```cpp
// 设置折线图
QVector<double> xData, yData;
// 填充xData和yData
QCPGraph *graph = ui->customPlot->addGraph();
graph->setData(xData, yData);
// 获取x轴和y轴
QCPAxis *xAxis = ui->customPlot->xAxis;
QCPAxis *yAxis = ui->customPlot->yAxis;
// 连接坐标轴的rangeChanged信号
connect(xAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(updateYRange(QCPRange)));
connect(yAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(updateXRange(QCPRange)));
// 定义槽函数
void MainWindow::updateYRange(QCPRange newRange)
{
double minY = std::numeric_limits<double>::max();
double maxY = -std::numeric_limits<double>::max();
// 遍历所有折线,找到y轴的最小值和最大值
for (int i = 0; i < ui->customPlot->graphCount(); ++i)
{
QCPGraph *graph = ui->customPlot->graph(i);
QCPDataMap::const_iterator it = graph->data()->lowerBound(newRange.lower);
while (it != graph->data()->constEnd() && it.key() <= newRange.upper)
{
minY = qMin(minY, it.value().value);
maxY = qMax(maxY, it.value().value);
++it;
}
}
// 更新y轴范围
ui->customPlot->yAxis->setRange(minY, maxY);
}
void MainWindow::updateXRange(QCPRange newRange)
{
double minX = std::numeric_limits<double>::max();
double maxX = -std::numeric_limits<double>::max();
// 遍历所有折线,找到x轴的最小值和最大值
for (int i = 0; i < ui->customPlot->graphCount(); ++i)
{
QCPGraph *graph = ui->customPlot->graph(i);
QCPDataMap::const_iterator it = graph->data()->lowerBound(newRange.lower);
while (it != graph->data()->constEnd() && it.key() <= newRange.upper)
{
minX = qMin(minX, it.key());
maxX = qMax(maxX, it.key());
++it;
}
}
// 更新x轴范围
ui->customPlot->xAxis->setRange(minX, maxX);
}
```
在这个示例中,我们连接了x轴和y轴的`rangeChanged`信号,并定义了`updateXRange`和`updateYRange`槽函数来更新坐标轴范围。在槽函数中,我们遍历所有的折线,找到它们在新范围内的最大值和最小值,然后更新对应的坐标轴范围。注意,我们使用了`qMin`和`qMax`函数来避免出现NaN或inf的情况。
阅读全文