Отображение значений графика при наведении мыши. - Обнаружение точек разброса
Я пытаюсь отобразить значения графика разных точек на моем QCustomPlot
, в котором у меня есть стиль линии lsLine
. Я знаю, что могу установить мышь над сигналом на QCustomPlot
но это действительно не поможет, так как мне просто нужно сообщить, когда мышь находится над моей строкой.Мой вопрос в том, есть ли способ узнать, находится ли мышь над моей точкой разброса. Есть ли сигнал, к которому я могу подключиться, который скажет мне, когда мышь находится над точкой разброса ?
3 ответов
Reimplement QCustomPlot::mouseMoveEvent
или подключиться к QCustomPlot::mouseMove
.
тогда используйте axes'coordToPixel
перевести (курсор) пиксельные координаты для построения координат и поиска ближайших точек в вашем QCPDataMap
С QMap::lowerBound(cursorX)
.
вы можете легко просто подключить слот к mouseMove
сигнал о том, что QCustomPlot
излучает. Затем вы можете использовать QCPAxis::pixelToCoord
чтобы найти координату:
connect(this, SIGNAL(mouseMove(QMouseEvent*)), this,SLOT(showPointToolTip(QMouseEvent*)));
void QCustomPlot::showPointToolTip(QMouseEvent *event)
{
int x = this->xAxis->pixelToCoord(event->pos().x());
int y = this->yAxis->pixelToCoord(event->pos().y());
setToolTip(QString("%1 , %2").arg(x).arg(y));
}
при использовании формата datetime (включая больше точек в секунду) оси X происходит сбой пикселя в coord. Если вы хотите отобразить координаты между точками, то это самый быстрый способ
может быть полезно (с подключенным сигнала QCustomplot::MouseMove
)
void MainWindow::onMouseMoveGraph(QMouseEvent* evt)
{
int x = this->ui->customPlot->xAxis->pixelToCoord(evt->pos().x());
int y = this->ui->customPlot->yAxis->pixelToCoord(evt->pos().y());
qDebug()<<"pixelToCoord: "<<data.key<<data.value; //this is correct when step is greater 1 second
if (this->ui->customPlot->selectedGraphs().count()>0)
{
QCPGraph* graph = this->ui->customPlot->selectedGraphs().first();
QCPData data = graph->data()->lowerBound(x).value();
double dbottom = graph->valueAxis()->range().lower; //Yaxis bottom value
double dtop = graph->valueAxis()->range().upper; //Yaxis top value
long ptop = graph->valueAxis()->axisRect()->top(); //graph top margin
long pbottom = graph->valueAxis()->axisRect()->bottom(); //graph bottom position
// result for Y axis
double valueY = (evt->pos().y() - ptop) / (double)(pbottom - ptop)*(double)(dbottom - dtop) + dtop;
//or shortly for X-axis
double valueX = (evt->pos().x() - graph->keyAxis()->axisRect()->left()); //graph width in pixels
double ratio = (double)(graph->keyAxis()->axisRect()->right() - graph->keyAxis()->axisRect()->left()) / (double)(graph->keyAxis()->range().lower - graph->keyAxis()->range().upper); //ratio px->graph width
//and result for X-axis
valueX=-valueX / ratio + graph->keyAxis()->range().lower;
qDebug()<<"calculated:"<<valueX<<valueY;
}
}