Seite 1 von 2
Bildvorschau und Navigator
Verfasst: 8. Dezember 2009 07:17
von toem
Moin!
Ich soll etwas ähnliches programmieren wie es auch in arc4all umgesetzt ist. Hier gibt es von einem abgelegten Dokument eine Miniaturvorschau (Navigator) in der man mit einem Rechteck einen Bereich auswählen kann.
Dieser Bereich wird dann in einer Bildanzeige groß dargestellt.
Kann mir jemand von Euch Tips geben, wie ich das am besten umsetze?
Ich bin bei C++ und QT noch sehr frisch drinn und mir fehlen noch einige Gundlagen.
Danke
Verfasst: 8. Dezember 2009 08:18
von toem
Ich bin inzwischen etwas weiter.
Ich zeig jetzt auf dem Image ein Rubberband an. Allerdings weiss ich noch nciht so recht, wie ich dies auf dem Image verschieben kann usw. und wie ich den Inhalt daraus später in die Bildvorschau bekomme.
Verfasst: 8. Dezember 2009 11:07
von toem
Also, ich habs soweit.
Allerdings hänge ich jetzt doch an dem Punkt, das Image aus Rubberband in mein großes Image zu zeichnen.
Heißt, ich müsste irgendwie QRubberband nach QImage konvertieren.
Einer noch ne Idee?
Verfasst: 8. Dezember 2009 13:08
von franzf
Du hast die Größe deines Original-Bildes. Du hast die Größe deines Anzeige-Fensters.
Damit hast du auch die Größe deines Preview-Widgets und die des RubberBand, sowie die Position des Letzteren in deinem Preview-Widget.
Ich würde eine verkleinerte Kopie des Original-Bildes (QPixmap::scaled()) als Preview anzeigen. Über die Lage und Größe deines Rubberband im Preview kannst du dir den Ausschnitt im großen Bild errechnen und diesen Teil anzeigen.
Ein "cast" von RubberBand nach QPixmap (oder eben QIamge) geht nicht und wäre auch unnötig, da wie oben gesagt sämtliche Größen zur Ausschnittsberechnung bekannt sind.
Verfasst: 8. Dezember 2009 13:30
von toem
Das hört sich schon ganz gut an.
Welche Befehle brauche ich für so was? Wie gesagt ich bin noch sehr frisch dabei und mir fehlen noch viele Grundlagen.
Ich gebs auch zu. Ich bekomms nicht hin.
Ich hab bislang nur die Koordinaten im Bild und die Größe des Bereiches. Aber wie schneide ich unter QT etwas aus einem Image aus?
Verfasst: 8. Dezember 2009 15:11
von spatro
Ich bin mir nicht ganz sicher, ob es das ist was du willst, aber probiers doch mal mit
QImage QImage::copy ( const QRect & rectangle = QRect() ) const
oder
QImage QImage::copy ( int x, int y, int width, int height ) const
Verfasst: 8. Dezember 2009 15:17
von toem
mmh
das kapier ich jetzt irgendwie gar nicht.
Also, ich habe ein QRubberBand namens rubberband und ein QImage namens m_img. Nun möchte ich den markierten Teil aus rubberband als Vollbild in m_img schreiben und darstellen.
Code: Alles auswählen
QRect rr = rubberband->rect();
m_img_rubber = m_img.copy(rr);
Vorrieges klappt leider nicht. Anscheinend ist in rubberband.rect() kein Inhalt.
Was mache ich noch falsch?
Verfasst: 9. Dezember 2009 08:54
von toem
Kann mir niemand mehr weiter helfen?
Ich steh total auf dem Schlauch.
Verfasst: 9. Dezember 2009 09:08
von upsala
Anscheinend ist in rubberband.rect() kein Inhalt.
Wenn du schon solche Vermutungen hast, warum überprüfst du sie dann nicht?
Verfasst: 9. Dezember 2009 09:08
von toem
Hab ich ja, ist nix drinn.
Aber warum nciht?
Verfasst: 9. Dezember 2009 09:27
von franzf
toem hat geschrieben:Hab ich ja, ist nix drinn.
Aber warum nciht?
Und wie hast du das überprüft?
Bitte Code und nicht Erklärungen...
Verfasst: 9. Dezember 2009 09:40
von toem
Das hat gestern nachmittag ein Kollege gemacht. Der ist aber heute krank.
Ich hab grade versucht, nach der Kopie das m_img_rubber neu zu zeichnen. Was gezeichnet wird ist eine leere Fläche. Also muss doch irgendwas im Code falsch laufen, oder seh ich das falsch?
Code: Alles auswählen
void DocView::mousePressEvent(QMouseEvent *event)
{
if (showrubberband)
{
origin = event->pos();
if (!rubberband)
rubberband = new QRubberBand(QRubberBand::Rectangle, this);
rubberband->setGeometry(QRect(origin, QSize()));
rubberband->show();
}
}
void DocView::mouseMoveEvent(QMouseEvent *event)
{
if (showrubberband)
{
rubberband->setGeometry(QRect(origin, event->pos()).normalized());
}
}
void DocView::mouseReleaseEvent(QMouseEvent *event)
{
if (showrubberband)
{
QRect rr = rubberband->rect();
m_img_rubber = m_img.copy(rr);
rubberband->hide();
delete rubberband;
rubberband = NULL;
}
}
void DocView::paintEvent(QPaintEvent */*e*/)
{
.....
p.setRenderHint(QPainter::SmoothPixmapTransform);
p.drawImage(rect().adjusted(1, 1, -2, -2), m_img_rubber);
}
Verfasst: 9. Dezember 2009 11:56
von spatro
Ich bin mir nicht sicher, aber hast du überprüft, ob das Rechteck, dass du durch das rubberband bekommst im selben Koordinatensystem ist wie das das Image. Ich könnte mir vorstellen, dass du versuchst einen Bereich außerhalb des Bildes zu kopieren. Hast du das mal überprüft?
Du könntest dir mal QRect QImage::rect () const ausgeben lassen und mit deinem Rechteck vergleichen. Evtl auch gleich mit
bool QRect::contains ( const QRect & rectangle, bool proper = false )
überprüfen, ob rr innerhalb des Bildes liegt.
Verfasst: 9. Dezember 2009 13:14
von toem
tja
gibt mir eindeutig ein TRUE zurück
Verfasst: 9. Dezember 2009 15:58
von toem
Noch eine Frage zu dem Thema:
Wenn ich mir die Größe eines Bildes über size() hole und die Position des Rubberband über rubberband.pos(), sind dann die Werte beide Male in Pixel? Oder muss ich noch was umrechnen?
Ich habe jetzt das Problem, das zwar das Bild aus dem Rubberband kopiert wird, aber es wird ein falscher Ausschnitt aus dem Image gewählt und angezeigt.
Hat von Euch schon einmal jemand so etwas mit dem Rubberband gemacht? Kan nmir nciht jemand noch ein paar Tips geben? Danke.