Próbuję wyświetlić wartości wykresu różnych punktów na moim QCustomPlot
, w którym mam styl linii lsLine
. Wiem, że mogłem ustawić mysz nad sygnałem na QCustomPlot
, ale to naprawdę nie pomoże, ponieważ po prostu muszę być poinformowany, gdy mysz znajduje się nad moją narysowaną linią.Mem pytanie jest czy jest jakiś sposób, aby dowiedzieć się, czy mysz jest ponad moim rozproszeniem punkt. Czy istnieje sygnał, z którym mógłbym się połączyć, aby powiedzieć, kiedy mysz znajduje się w punkcie rozproszenia?Wyświetl wartości wykresu po najechaniu myszą. - Wykryj punkty rozproszenia
Odpowiedz
Ponownie zaimplementuj QCustomPlot::mouseMoveEvent
lub połącz z QCustomPlot::mouseMove
.
Następnie użyj osi coordToPixel
, aby przetłumaczyć (kursor) piksele, aby wykreślić współrzędne i wyszukać najbliższe punkty w swoim QCPDataMap
za pomocą QMap::lowerBound(cursorX)
.
Możesz łatwo po prostu podłączyć gniazdo do sygnału mouseMove
, który emituje QCustomPlot
. Następnie można użyć QCPAxis::pixelToCoord
znaleźć współrzędnych:
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));
}
Jeśli mam dwa wykresy w ui, 'ui-> widget_graph1' i' ui-> widget_graph2', jak mogę to zrobić dla obu wykresów? Czy powinienem zmienić nazwę funkcji "void CustomPlot :: showPointToolTip (QMouseEvent * event) {}", aby pasowała do mojej skrzynki? Chcę, aby oba wykresy pokazywały współrzędne po najechaniu myszką, dzięki – Wei
@Wei Jeśli zaimplementujesz slot w kodzie źródłowym 'QCustomPlot' tak jak ja, wskazówka narzędzia zostanie pokazana dla wszystkich wykresów. Możesz także mieć slot w innej klasie i użyć 'sender()', aby znaleźć wykres, który wyemitował sygnał 'mouseMove'. – Nejat
Udało mi się tylko znaleźć 'QCustomPlot :: toolTip' i zmieniłem twoje' void QCustomPlot :: showPointToolTip (QMouseEvent * event) {} 'na' void QCustomPlot :: toolTip (event QMouseEvent *) {} 'Czy byłoby to takie samo ? – Wei
kiedy użyć formatu datetime (w tym więcej miejsca na sekundę) z osi X, wtedy piksel do COORD zawiedzie. Jeśli chcesz wyświetlić współrzędne między punktami, to jest to najszybszy sposób
może przydać (z podłączonym sygnałem 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;
}
}
@Rajeshwar 'coordToPixel' przekłada współrzędne działka na współrzędne piksela. Jak rozwiązał twój problem? – Nejat