QT Bilddarstellung (QGraphicsView)



  • Hallo zusammen.

    Ich versuche mich gerade in der Darstellung eine Bildes.

    Also erstmal wird ein Bild per OpenDialog eingelesen (QImage),
    danach wird es kopiert und bearbeitet (immer noch als QImage).

    Dann stelle ich es in QGraohicsView dar:

    (output ist ein Zeiger auf ein QImage)

    QGraphicsScene *sc = new QGraphicsScene();
    sc->setBackgroundBrush(QBrush(*output));
    ui->graphicsView->setScene(sc);
    

    So, das ganze sieht nun leider so aus:

    http://img5.imagebanana.com/img/cresr7t5/Unbenannt.PNG

    Ja leider wird das Bild nicht einmal dargestellt sondern einfach als Tapete...

    Wie stelle ich es einzelln dar?

    Am besten wäre es, wenn das Bild kleiner als das GraphicsView ist, das es passen skalliert wird (natürlich im richtigen verhältnis) größer in dem graphicsview dargstellt wird.

    Oder halt wenn das Bild größer als das GraphicsView ist, das es im richtigen verhältnis verkleinert wird und dann dargestellt wird.

    Wie stelle ich es an?

    Danke schonmal (:

    Gruß
    Frank



  • class Sprite : public QGraphicsItem
    {
    public:
        Sprite(QGraphicsItem * parent = 0) : QGraphicsItem(parent)
        {}
    
        void setImage(const QImage & img) { m_img = QImage(img); }
    
        QRectF boundingRect() const
        {
            return m_img.rect().adjusted(2,2,2,2);
        }
    
        void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                   QWidget *widget)
        {
            Q_UNUSED(option);
            Q_UNUSED(widget);
            painter->drawImage(0,0,m_img);
        }
    private:
        QImage m_img;
    };
    
    QGraphicsScene m_scene;
    
        Sprite * m = new Sprite;
        m->setImage(QImage(":/icons/snail"));
        m_scene.addItem(m);
    

    Das Vergrößern usw überlass ich mal dir 🙂



  • Alternativ schau dir QGraphicsPixmapItem an



  • hi,

    danke für deine Mühe, so umständlich wollte ich es nicht machen.

    ui->graphicsView->fitInView(sc->sceneRect(), Qt::KeepAspectRatio);
    

    QGraphicsView hat eine Methode: fitInView(), mit dieser kann ich das Bild quasi automatisch anpassen in das GraphicsView.

    Leider noch nicht ganz 100%tig, mein GraphicsView ist z.B. 400*300 groß und wenn ich da jetzt ein 200*150 bild reinmache, passts peferkt, weil das ja das selbe verhälnis ist, oder auch 800*600 passt optimal.

    Wenn ich jetzt aber 400*400 darein packen will, dann muss er ja erstmal das verhältnis anpassen also 300*300 würde er ja logischerweise machen müssen, das würde wieder passen.

    Dann stimmt das Verhältnis (1:1) aber leider fehlen 100 pixel in der Breite, die werden dann mit dem Bild wieder aufgefüllt.

    Im Prinzip wieder ein Tapeteneffekt, nun siehts aber besser aus, weil das bild erstmal in der grl´t Möglichen auflösung darein gepackt wird, der rest der durch die auflösung nichtmehr passt wird tapetenartig aufgefüllt...

    Weißt du da obs da was gegen gibt?

    Gruß
    frank


  • Mod

    Hm, für die einfache Bildanzeige gibts in wxWidgets wxStaticBitmap, eigentlich müsste Qt doch was vergleichbares haben.
    Ansonsten schnell selberschreiben, evtl. geht es sogar schon mit einem QLabel (hier geht auch z.b. HTML code, was ich aber eher dirty fände ;)).


Anmelden zum Antworten