2013-08-09 14 views
9

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

9

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).

+0

@Rajeshwar 'coordToPixel' przekłada współrzędne działka na współrzędne piksela. Jak rozwiązał twój problem? – Nejat

6

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)); 

} 
+0

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

+0

@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

+0

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

2

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; 
     } 
} 
Powiązane problemy