我有一系列的散点m_scatterseries(蓝色散点),通过函数找到散点峰值并将它们添加到散点系列对象 peaksSeries(绿色散点)。我想用垂直于x轴的直线来在图表上展示峰值,但我的垂直直线似乎没有与坐标轴同步,有什么方法解决这一问题吗?
以下是我的部分代码:
m_chart = new QChart(); // 创建一个 QChart 对象
m_scatterseries = new QScatterSeries(m_chart); // 创建一个 QScatterSeries 对象,并将其添加到 QChart 对象中
axisY = new QValueAxis; // 创建一个 QValueAxis 对象用作 Y 轴
axisX = new QValueAxis; // 创建一个 QValueAxis 对象用作 X 轴
m_chart->setAxisX(axisX, m_scatterseries); // 将 X 轴与散点系列关联
m_chart->setAxisY(axisY, m_scatterseries);// 将Y轴与散点图系列关联
chartView1 = new QChartView(m_chart);
this->setCentralWidget(chartView1);// 设置图表视图为主窗口的中央部件,即将图标内容在主窗口中显示出来
// 调用寻峰处理函数,设置阈值为30
std::vector<int> peaks = findPeaks(m_scatterseries, 30);
// 在图表上显示峰值
QScatterSeries *peaksSeries = new QScatterSeries; // 创建一个散点系列对象 peaksSeries
for (int peak : peaks) // 对于每个峰值点 peak
{
qreal y = m_scatterseries->at(peak).y(); // 获取对应峰值点的 Y 值
peaksSeries->append(peak, y); // 将峰值点的 X 和 Y 值添加到散点系列中
qDebug()<<"YES:"<<peak;
}
m_chart->addSeries(peaksSeries); // 将峰值散点系列添加到图表中
// 遍历峰值点系列的数据点
for (int i = 0; i < peaksSeries->count(); i++)
{
// 获取当前数据点的 x 坐标值
qreal xValue = peaksSeries->at(i).x();
qDebug()<<"xValue is:"<<xValue;
// 创建一条垂直实线
QGraphicsLineItem *verticalLine = new QGraphicsLineItem();
verticalLine->setLine(xValue, m_chart->plotArea().top(), xValue, m_chart->plotArea().bottom());
verticalLine->setPen(QPen(Qt::black));
m_chart->scene()->addItem(verticalLine); // 将垂直线添加到图表中
}

【以下回答由 GPT 生成】
首先,您可以尝试使用QChart的setAxis*函数来将直线的坐标系设置为图表的坐标系,而不是把直线添加到图表场景中。
接下来,您可以使用QChart的addAxis函数将直线的坐标轴添加到图表中。这将确保直线与坐标轴同步。
以下是修改后的代码示例:
m_chart = new QChart(); // 创建一个 QChart 对象
m_scatterseries = new QScatterSeries(m_chart); // 创建一个 QScatterSeries 对象,并将其添加到 QChart 对象中
axisY = new QValueAxis; // 创建一个 QValueAxis 对象用作 Y 轴
axisX = new QValueAxis; // 创建一个 QValueAxis 对象用作 X 轴
m_chart->setAxisX(axisX); // 设置 X 轴
m_chart->setAxisY(axisY); // 设置 Y 轴
m_chart->addSeries(m_scatterseries); // 将散点系列添加到图表中
m_scatterseries->attachAxis(axisX); // 将 X 轴与散点系列关联
m_scatterseries->attachAxis(axisY); // 将 Y 轴与散点图系列关联
chartView1 = new QChartView(m_chart);
this->setCentralWidget(chartView1); // 设置图表视图为主窗口的中央部件,即将图标内容在主窗口中显示出来
// 调用寻峰处理函数,设置阈值为30
std::vector<int> peaks = findPeaks(m_scatterseries, 30);
// 在图表上显示峰值
QScatterSeries *peaksSeries = new QScatterSeries; // 创建一个散点系列对象 peaksSeries
for (int peak : peaks) // 对于每个峰值点 peak
{
qreal y = m_scatterseries->at(peak).y(); // 获取对应峰值点的 Y 值
peaksSeries->append(peak, y); // 将峰值点的 X 和 Y 值添加到散点系列中
qDebug() << "YES:" << peak;
}
m_chart->addSeries(peaksSeries); // 将峰值散点系列添加到图表中
// 遍历峰值点系列的数据点
for (int i = 0; i < peaksSeries->count(); i++)
{
// 获取当前数据点的 x 坐标值
qreal xValue = peaksSeries->at(i).x();
qDebug() << "xValue is:" << xValue;
// 创建一条垂直实线
QGraphicsLineItem *verticalLine = new QGraphicsLineItem();
verticalLine->setLine(xValue, m_chart->plotArea().top(), xValue, m_chart->plotArea().bottom());
m_chart->addAxis(verticalLine); // 将直线的坐标轴添加到图表中
}
通过这些修改,垂直直线应该能够正确地与坐标轴同步了。如果仍然存在问题,请提供更多上下文和代码,并描述问题的具体表现,我会进一步协助您解决该问题。