Pobieranie współrzędnych z innej klasy



  • Witam!

    Mam QGraphicsView w którym wyświetlam obraz i myszką zaznaczam punkty kluczowe. Chce odczytać teraz ich współrzędne i wypisać je na głównym formie w momencie powstania nowego punktu, ale chyba źle to robie :/ Mój kod wygląda tak:

    @void MarkerEditor::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
    {
    int i = 0;

    QRectF pozycjaKropki(QPointF(), QSizeF(rozmiarKropki, rozmiarKropki));
    [...]
    pozycjaKropki.translated(dX, dY);
    if(event){
        wspKropek[i][1] = dX;
        wspKropek[i][2] = dY;
        i++;
    }
    

    }

    qreal MarkerEditor::pobierzWsp()
    {
    return wspKropek[2][2];
    }@

    @QGraphicsScene *scena = new QGraphicsScene(ui->graphicsViewZdjecie1);
    QPixmap mapaPikseli(nazwaZdjecia1);
    ui->graphicsViewZdjecie1->setScene(scena);
    MarkerEditor *edytorMarkerow1 = new MarkerEditor();
    scena->addItem(edytorMarkerow1);
    edytorMarkerow1->setPos(0, 0);
    edytorMarkerow1->setPixmap(mapaPikseli);
    ui->graphicsViewZdjecie1->fitInView(scena->itemsBoundingRect(),Qt::KeepAspectRatio);
    ui->graphicsViewZdjecie1->show();
    update();
    qreal wspMarkerow1[2][2];
    wspMarkerow1[2][2] = edytorMarkerow1->pobierzWsp();
    ui->lineEdit1kropka1x->setText(QString::number(wspMarkerow1[0][0]));
    ui->lineEdit1kropka1y->setText(QString::number(wspMarkerow1[0][1]));
    ui->lineEdit1kropka2x->setText(QString::number(wspMarkerow1[1][0]));
    ui->lineEdit1kropka2y->setText(QString::number(wspMarkerow1[1][1]));@

    Gdyby komuś się chciało na to spojrzeć i podpowiedzieć co robię źle i jak to powinienem zrealizować to będę wdzięczny.



  • @void MarkerEditor::mousePressEvent(QGraphicsSceneMouseEvent *event)
    {
    QPointF pozycjaMyszki = event->pos();
    qDebug() << pozycjaMyszki;
    }@

    W tej samej klasie utwórz sygnał np:
    @signals:
    void tuKliknalem(QPointF);@

    i dodaj to mousePressEvent emita:
    @void MarkerEditor::mousePressEvent(QGraphicsSceneMouseEvent *event)
    {
    QPointF pozycjaMyszki = event->pos();
    qDebug() << pozycjaMyszki;
    emit tuKliknalem(pozycjaMyszki);
    }@



  • Ok wszystko fajnie działa, sygnał jest emitowany bo współrzędne wyświetlają się w oknie komunikatów aplikacji. Chce jeszcze aby te punkty zostały wyświetlone w kontrolkach typu lineEdit. Mam te kontrolki na formatce tylko co teraz? Stworzyłem sobie slot, który ma przejmować ten sygnał i współrzędne numerować według kolejności a wszystko przechowywać w tablicy dwuwymiarowej tak aby w każdej chwili był dostęp do poszczególnych pozycji, a w metodzie gdzie tworze obiekt klasy MarkerEditor ustawiam connect'a slotu z sygnałem ale cos jest dalej nie tak :/ Pomoże ktoś?

    Wyemitowanie sygnału z klasy MarkerEditor:
    @emit klikniecieWObraz(pozycjaMyszki);@

    Slot w klasie MainWindow mający przechwycić dane i uzupełnić nimi tablicę:
    @int i = 0;
    QString wspPunktow[8][8];

    void MainWindow::pobranieWspPunktu(QPointF punkt)
    {
    wspPunktow[i][1] = (i);
    wspPunktow[i][2] = QString::number(punkt.rx());
    wspPunktow[i][3] = QString::number(punkt.ry());
    i++;
    }@

    Połączenie sygnału ze slotem w metodzie zawierającej obiekt klasy MarkerEditor:
    @QObject::connect(edytorMarkerow1->klikniecieWObraz(QPointF), SIGNAL(mouseReleaseEvent()), this, SLOT(pobranieWspPunktu(QPointF punkt)));@

    Nadal ucze się slotów i sygnałów i dopiero zaczynam łapać o co w nich chodzi.



  • w slocie pobranieWspPunktu dodaj:
    @ui->lineEdit->setText(punkt);@



  • Ok coś się ruszyło - wielkie dzięki savlor :) - jednak jeszcze wywala błąd z connectem. Według składni powinno być ok, a kompilator wywala że nie mozna użyć typu QPointF jako wyrażenia:

    @QObject::connect(edytorMarkerow1->klikniecieWObraz(QPointF), SIGNAL(mouseReleaseEvent()), this, SLOT(pobranieWspPunktu(punkt)));@

    Błąd:
    błąd:C2275: "QPointF": niedozwolone uľycie tego typu jako wyraľenia
    C:\Qt\Qt5.0.2\5.0.2\msvc2012_64\include\QtCore/qpoint.h(213): zobacz deklaracj© "QPointF"

    Co do samego przypisywania tekstu do lineEdit to wiem jak to zrobić tyle że priorytetem dla mnie jest umieszczenie tych punktów w tablicy dwuwymiarowej, bo muszę na jednym obrazie zaznaczyć aż sześć punktów kluczowych.

    W tej chwili mój slot wygląda następująco:
    @QString wspPunktow[6][6];
    int i = 0;

    void MainWindow::pobranieWspPunktu(QPointF punkt)
    {
    wspPunktow[i][1] = (i); //numerowanie kolejności klikanych punktów
    wspPunktow[i][2] = QString::number(punkt.rx());
    wspPunktow[i][3] = QString::number(punkt.ry());
    i++;

    ui->lineEdit1kropka1x->setText(wspPunktow[1][2]);
    ui->lineEdit1kropka1y->setText(wspPunktow[1][3]);
    //póki co tylko jeden punkt dla testów
    

    }@



  • Nie zagłębiałem się zbytnio w kod ale w QObject::connect sygnał musi mieć taki sam typ jak slot np.
    @ connect(mThread, SIGNAL(NumberChanged(int)), this, SLOT(testowa_funkcja(int)));
    @

    A co do wypisywania to możesz za pomocą pętli for to wykonać.



  • connecta musisz poprawić z:
    @QObject::connect(edytorMarkerow1->klikniecieWObraz(QPointF), SIGNAL(mouseReleaseEvent()), this, SLOT(pobranieWspPunktu(QPointF punkt)));@
    na:
    @QObject::connect(edytorMarkerow1, SIGNAL(mouseReleaseEvent(QPointF)), this, SLOT(pobranieWspPunktu(QPointF)));@



  • Super, jesteś wielki savlor! LineEdit'y poprawnie przechwytują dane w momencie kliknięcia, a i sloty i sygnały wreszcie stały się dla mnie zrozumiałe.

    Powiedzcie mi jeszcze taką rzecz bo kompletnie nie wiem jak się do tego zabrać, a wydaje mi się, że jedna linijka gdzieś wstawiona jest w stanie załatwić sprawę - jeśli mam współrzędne x i y punktu w lineEdit'ach i chciałbym je zmienić wpisując z klawiatury inne wartości i np. poprzez naciśnięcie klawisza Enter lub specjalnego przycisku np. Aktualizuj lub whatever, aby ten naniesiony punk się zmienił. Sprawa wygląda trywialnie tyle że biorąc pod uwagę powyższy kod i fakt że cała obsługa punktów na obrazie i samych obrazów w QGraphicsView mieści się w kilku obiektach i pod innym przyciskiem, to właśnie sprawia że ja na to pomysłu już nie mam :/ Może jakieś sprytne odwołanie istnieje, bądź coś w stylu: @update();@ (tylko tego co potrzeba :D ), choć sam ten przykład już sprawdzony przeze mnie, i za pięknie by to było gdyby zadziałał :/



  • Wydaje mi się że to nie będzie już takie proste. Zamiast tablicy powinieneś utworzyć jakaś klasę, w której będziesz pamiętał poprzedni kolor (przed zaznaczeniem) i w momencie kiedy zmieniasz współrzędne ustawić kolor piksela na oryginalny. Jednocześnie zaznaczyć nowy piksel ponownie zapamiętując jego poprzedni kolor.
    Przerób mniej więcej tak:
    @void MarkerEditor::mousePressEvent(QGraphicsSceneMouseEvent *event)
    {
    QPointF pozycjaMyszki = event->pos();
    QRgb rgbKolor = pixmap().toImage().pixel(pozycjaMyszki.x(), pozycjaMyszki.y());
    emit tuKliknalem(pozycjaMyszki,rgbKolor );
    }@

    A potem w slocie zapiszesz kolor i pozycje do klasy (tej którą zrobisz zamiast tablicy).



  • No właśnie tego chciałbym uniknąć, i chyba narazie to odpuszczę bo nie mam na to zbytnio czasu. Póki co cały obrazek z naniesionymi punktami muszę przekazać na nowy form i teraz z tym głowie się jak to zrobić :/

    Czy przekazywać nazwy i tablice współrzędnych i nanosić je ponownie na nowym formie czy może zapisać plik z naniesionymi punktami w postaci temp'a i go otworzyć w nowym formie? Co o tym myślicie i jak to zrobić? :)

    edit: O kurcze! Nawet kod wkleiłeś, w takim razie zabieram się za budowanie nowej klasy obsługującą ten kolor i podmianę :) Dzięki wielkie!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.