Qt wykresy jak od widoku danych przejsc do danych ?

0

Analizuje sobie ten przykład https://doc.qt.io/qt-6/qtcharts-pointsselectionandmarkers-example.html
screenshot-20220423005417.png

constexpr qreal marker_size = 20.;

QSplineSeries *series = new QSplineSeries();
series->append({QPointF(0., 0.),
                QPointF(0.5, 2.27),
                QPointF(1.5, 2.2),
                QPointF(3.3, 1.7),
                QPointF(4.23, 3.1),
                QPointF(5.3, 2.3),
                QPointF(6.47, 4.1)
               });
series->setMarkerSize(marker_size);
series->setLightMarker(Utilities::redRectangle(marker_size));
series->setSelectedLightMarker(Utilities::blueTriangle(marker_size));
QObject::connect(series, &QXYSeries::clicked, series, [&](const QPointF &point) {
   int index = series->points().indexOf(point);
   if (index != -1)
       series->toggleSelection({index});
});

Narysowałem punkty,
Klikam w wybrany punkt na wykresie
Mam indeks punktu

I teraz chciałbym zmodyfikować wybrany punkt (np. przesunąć go myszką)

Jak dostać się do danych wykresu ?
Nie dostrzegam metody jaka moge "dokopać się" od wykresu do danych

0

Nie jestem pewien czy rozumiem. Weźmy na przykład dwa pierwsze punkty: x 0,0 y 0,0 i x 0,5 y 2,27. Chcesz znaleźć wartości y dla x pomiędzy 0 i 0,5?

0
PerlMonk napisał(a):

Nie jestem pewien czy rozumiem. Weźmy na przykład dwa pierwsze punkty: x 0,0 y 0,0 i x 0,5 y 2,27. Chcesz znaleźć wartości y dla x pomiędzy 0 i 0,5?

Wykres składa się z 7 punktów,
trzeci punkt to "QPointF(1.5, 2.2)"

chciałbym zmienić kliknięciem wartość tego punktu w serii na nową wartość np. na "QPointF(1.5, 1.0)"

Znalazłem rozwiązania !
Szukałem QXYSeries::replace(...)

    QObject::connect(series, &QXYSeries::clicked, series, [&](const QPointF &point) {
       int index = series->points().indexOf(point);
       if (index != -1)
       {
           series->toggleSelection({index});
           // list[index] = QPointF(1.5, 1.0);  // to nie działa 
           series->replace(list[index], QPointF(1.5, 1.0) ); 
       }

    });

Pewnie trzeba coś jeszcze zrobić aby wykres przerysował nowe wartości , albo wykres ma kopie danych wiec nie tedy droga

0

A jak znaleźć indeks klikniętego markera na wykresie w "mousePressEvent" ?

W Delphi seria ma metodę Clicked(X,Y) która zwraca indeks klikniętego markera

Nie widzę czy też trzeba to sobie po prostu policzyc ?
Dla wszystkich punktów w serii policzyc odleglosc wzgledem m_mousePos
Zamienić na piksele
Sprawdzic czy mniejsze niz "MarkerSize"

Nie znalazlem gotowej funkcji w Qt wiec chyba trzeba samemu
rozwiązane poniżej

class QChartViewM : public QChartView
{
public:
    explicit QChartViewM(QChart *chart, QWidget *parent = nullptr);
    ~QChartViewM();
    QSplineSeries *series;  // moja seria
protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
private:
    QPoint m_mousePos;  // start position
    int m_index {-1};   // index selected marker 
};

void QChartViewM::mousePressEvent(QMouseEvent *event)
{
    // funkcja aktualizuje indeks zaznaczonego markera
    // jak nie znajdzie ustawia -1
    m_index = -1;

    // pozycja w PIXEL
    m_mousePos = event->pos();

    // pozycja w CHART
    QPointF mousePointOnChart = chart()->mapToValue(m_mousePos);

    // skala PIXEL -> CHART
    QPointF skala_y = chart()->mapToValue(QPoint(0,0)) -  chart()->mapToValue(QPoint(0,1)) ;
    QPointF skala_x = chart()->mapToValue(QPoint(0,0)) -  chart()->mapToValue(QPoint(1,0)) ;


    for(int i=0 ; i < series->points().size() ; ++i)
    {
        // odleglosc punktu
        auto distanceOnChart =  mousePointOnChart - series->at(i);

        // zamiana na PIXEL
        int pix_x = distanceOnChart.x() / skala_x.x();
        int pix_y = distanceOnChart.y() / skala_y.y();

        // warunek "polowa markSize"
        if (  (abs(pix_x) <= series->markerSize()/2)  &&  (abs(pix_y) <= series->markerSize()/2))
        {
            qDebug() << "znalazlem m_index=" << i;
            m_index = i;
            series->setPointSelected(m_index,true);
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1