本文用于工作时遇到问题的学习记录
情景是在使用Qcustomplot绘制了多条散点后,目标是移动鼠标,在靠近绘制的散点时显示对应的散点信息。我的项目限定是只显示选定的一条散点的信息,通过点击图例或散点进行选定。代码不全
//HandleMouseMoveEvent是我自定义的,当然可以直接调Qt的鼠标事件
// ui.chartView是我调用Qcustomplot的界面
void HandleMouseMoveEvent(QMouseEvent* event)
{
//有多条散点
for (int i = 0; i < ui.chartView->graphCount(); ++i)
{
//图例的选中联动,之前代码我已经实现。条件:需选中对应图例才显示散点
QCPGraph* graphItem = ui.chartView->graph(i);
if (graphItem->selected())
{
// 获取鼠标相对于图形的位置
QPointF pos = event->pos();
// 将坐标转换到图形坐标系
qreal xCoord = ui.chartView->xAxis->pixelToCoord(pos.x());
qreal yCoord = ui.chartView->yAxis->pixelToCoord(pos.y());
//记录X轴和Y轴的大小。目标:实现远离点时,不显示点的信息
double visibleWidth = ui.chartView->xAxis->range().size();
double visibleHeight = ui.chartView->yAxis->range().size();
// 分别根据可视区域的大小来估算水平和垂直方向的阈值,根据需要修改暂时都 *0.05
double horizontalThreshold = visibleWidth * 0.05;
double verticalThreshold = visibleHeight * 0.05;
// 找到离鼠标位置最近的数据点
double minDistance = std::numeric_limits<double>::max();
//设置最近点的index为-1
int nearestPointIndex = -1;
//读取graph中绘制的散点,找到最近点的index
for (int j = 0; j < ui.chartView->graph(i)->dataCount(); ++j) {
double horizontalDistance = qAbs(xCoord - ui.chartView->graph(i)->data()->at(j)->key);
double verticalDistance = qAbs(yCoord - ui.chartView->graph(i)->data()->at(j)->value);
double totalDistance = qSqrt(qPow(horizontalDistance, 2) + qPow(verticalDistance, 2));
if (horizontalDistance <= horizontalThreshold &&
verticalDistance <= verticalThreshold &&
totalDistance < minDistance) {
minDistance = totalDistance;
nearestPointIndex = j;
}
}
if (nearestPointIndex != -1) {
QDebug()<<"X:"<<ui.chartView->graph(i)->data()->at(nearestPointIndex)->key;
QDebug()<<"Y:"<<ui.chartView->graph(i)->data()->at(nearestPointIndex)->value;
} else {
//设置不显示点
}
}
}
}
请多多指教^_^!;