Я пытаюсь отобразить значения графика различных точек на моем QCustomPlot
в котором у меня есть стиль линии lsLine
, Я знаю, что могу поставить указатель мыши на QCustomPlot
но это не очень помогает, так как мне просто нужно знать, когда мышь находится над моей нанесенной линией. Мой вопрос, есть ли способ узнать, находится ли мышь над моей точкой разброса. Есть ли сигнал, к которому я мог бы подключиться, который сообщал бы мне, когда мышь находится над точкой рассеяния?
Перепишите QCustomPlot::mouseMoveEvent
или подключиться к QCustomPlot::mouseMove
,
Тогда используйте топоры 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));
}
Когда вы используете формат даты и времени (включая большее количество точек в секунду) оси X, пиксель к координатам не выполняется.
Если вы хотите отобразить координаты между точками, то это самый быстрый способ
может быть полезно (с подключенным сигналом 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;
}
}