用qcustomplot插件,写一段有选择框功能,选择框选中的地方,数据只拉伸x轴数据,y轴数据不动
时间: 2023-09-03 15:16:30 浏览: 71
首先,我们需要在选择框选中时,获取到选中区域的起始和结束点的横坐标,然后将这个区域内的数据进行拉伸。可以使用QCustomPlot中的`QCPDataRange`类来表示一个数据区间。
具体步骤如下:
1. 创建一个选择框,并连接`selectionChangedByUser()`信号,该信号在选择框被用户改变时发出。
```cpp
QCPItemRect *selectionRect = new QCPItemRect(ui->plot);
ui->plot->addItem(selectionRect);
selectionRect->setPen(QPen(Qt::blue));
selectionRect->setBrush(QBrush(QColor(0, 0, 255, 50)));
selectionRect->setVisible(false);
connect(ui->plot, SIGNAL(selectionChangedByUser()), this, SLOT(onSelectionChanged()));
```
2. 在`onSelectionChanged()`槽函数中,获取选择框的起始和结束点横坐标,然后根据这个区间来拉伸x轴数据。
```cpp
void MainWindow::onSelectionChanged()
{
// 获取选择框选中的区域
QRectF selectionRect = ui->plot->selectionRect()->rect();
// 获取选择框选中的横坐标区间
double x1 = ui->plot->xAxis->pixelToCoord(selectionRect.left());
double x2 = ui->plot->xAxis->pixelToCoord(selectionRect.right());
// 获取x轴的数据范围
QCPDataRange xRange = ui->plot->xAxis->dataRange();
// 将选择框选中的区域转换为x轴数据区间
QCPDataRange selectedRange(x1, x2);
// 如果选择框没有选中任何点,则不进行拉伸操作
if (selectedRange.isEmpty())
return;
// 将x轴数据区间拉伸到选择框选中的区域
xRange.expand(selectedRange);
// 更新x轴的数据范围
ui->plot->xAxis->setRange(xRange);
// 重新绘制图形
ui->plot->replot();
}
```
注意,这里只拉伸x轴数据,y轴数据不变,所以我们只需要更新x轴的数据范围即可。
完整的代码如下:
```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qcustomplot.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建一个QCustomPlot对象
ui->plot->addGraph();
// 添加一些随机数据
QVector<double> xData(100);
QVector<double> yData(100);
for (int i = 0; i < 100; i++)
{
xData[i] = i;
yData[i] = qSin(i / 10.0) * 10 + qrand() % 10;
}
// 将数据添加到QCustomPlot对象中
ui->plot->graph(0)->setData(xData, yData);
// 设置x轴和y轴的范围
ui->plot->xAxis->setRange(0, 100);
ui->plot->yAxis->setRange(-20, 20);
// 创建一个选择框,并连接selectionChangedByUser()信号
QCPItemRect *selectionRect = new QCPItemRect(ui->plot);
ui->plot->addItem(selectionRect);
selectionRect->setPen(QPen(Qt::blue));
selectionRect->setBrush(QBrush(QColor(0, 0, 255, 50)));
selectionRect->setVisible(false);
connect(ui->plot, SIGNAL(selectionChangedByUser()), this, SLOT(onSelectionChanged()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onSelectionChanged()
{
// 获取选择框选中的区域
QRectF selectionRect = ui->plot->selectionRect()->rect();
// 获取选择框选中的横坐标区间
double x1 = ui->plot->xAxis->pixelToCoord(selectionRect.left());
double x2 = ui->plot->xAxis->pixelToCoord(selectionRect.right());
// 获取x轴的数据范围
QCPDataRange xRange = ui->plot->xAxis->dataRange();
// 将选择框选中的区域转换为x轴数据区间
QCPDataRange selectedRange(x1, x2);
// 如果选择框没有选中任何点,则不进行拉伸操作
if (selectedRange.isEmpty())
return;
// 将x轴数据区间拉伸到选择框选中的区域
xRange.expand(selectedRange);
// 更新x轴的数据范围
ui->plot->xAxis->setRange(xRange);
// 重新绘制图形
ui->plot->replot();
}
```
阅读全文