Отображение значений графика при наведении мыши. — Определить точки разброса

Я пытаюсь отобразить значения графика различных точек на моем QCustomPlot в котором у меня есть стиль линии lsLine, Я знаю, что могу поставить указатель мыши на QCustomPlot но это не очень помогает, так как мне просто нужно знать, когда мышь находится над моей нанесенной линией. Мой вопрос, есть ли способ узнать, находится ли мышь над моей точкой разброса. Есть ли сигнал, к которому я мог бы подключиться, который сообщал бы мне, когда мышь находится над точкой рассеяния?

9

Решение

Перепишите QCustomPlot::mouseMoveEvent или подключиться к QCustomPlot::mouseMove,

Тогда используйте топоры coordToPixel чтобы перевести (курсор) координаты пикселей для построения координат и поиска ближайших точек в вашем QCPDataMap с QMap::lowerBound(cursorX),

9

Другие решения

Вы можете легко подключить слот к 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));

}
7

Когда вы используете формат даты и времени (включая большее количество точек в секунду) оси 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;
}
}
2
По вопросам рекламы [email protected]