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!