Bildvorschau und Navigator

Alles rund um die Programmierung mit Qt
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Bildvorschau und Navigator

Beitrag 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
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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?
spatro
Beiträge: 46
Registriert: 18. Juni 2008 10:54

Beitrag 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
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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?
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Kann mir niemand mehr weiter helfen?
Ich steh total auf dem Schlauch.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Anscheinend ist in rubberband.rect() kein Inhalt.
Wenn du schon solche Vermutungen hast, warum überprüfst du sie dann nicht?
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Hab ich ja, ist nix drinn.
Aber warum nciht?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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...
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

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

spatro
Beiträge: 46
Registriert: 18. Juni 2008 10:54

Beitrag 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.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

tja

Code: Alles auswählen

bool so = m_img.rect().contains(rr, false);
gibt mir eindeutig ein TRUE zurück
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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.
Antworten