c++ - Visualice los valores de trazado en el mouse.-Detectar puntos Scatter
qt mouseover (3)
Reimplemente QCustomPlot::mouseMoveEvent
o conéctese a QCustomPlot::mouseMove
.
A continuación, utilice coordToPixel
ejes para traducir coords de píxel (cursor) para trazar coords y buscar los puntos más cercanos en su QCPDataMap
con QMap::lowerBound(cursorX)
.
Estoy intentando mostrar los valores de trazado de diferentes puntos en mi QCustomPlot
en el que tengo un estilo de línea de lsLine
. Sé que podría establecer un mouse sobre la señal en el QCustomPlot
pero eso no QCustomPlot
mucha ayuda ya que solo necesito que me informen cuando el mouse esté sobre mi línea trazada. Mi pregunta es si hay alguna forma de averiguar si el mouse está sobre mi dispersión. punto. ¿Hay alguna señal a la que me pueda conectar que me diga cuando el mouse está sobre un punto de dispersión?
Simplemente puede conectar una ranura a la señal de mouseMove
que QCustomPlot
emite. Luego puede usar QCPAxis::pixelToCoord
para encontrar la coordenada:
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));
}
cuando usa el formato de fecha y hora (incluyendo más puntos por segundo) del eje X, entonces falla el píxel a coord. Si quieres mostrar las coordenadas entre los puntos, entonces esta es la forma más rápida
tal vez útil (con la señal conectada 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;
}
}