Seite 1 von 1

QCanvas statt QPixmap (mit QLabel), um Bilder anzuzeigen

Verfasst: 28. Oktober 2004 10:24
von JulesBashir
Hallo Leute!

Ich bin neu hier. Habe leider noch keinen passenden Beitrag gefunden, der mein Problem löst.

Ich benutze zur Zeit ein QPixmap mit einem QLabel um ein Bild in Originalgröße anzuzeigen.
Nun möchte ich aber ein QCanvas benutzen, damit ich auch zoomen kann etc.
Meine Versuche schlugen bisher immer fehl, wenn ich versuchte irgendein Bild anzuzeigen.
Danke im Voraus.

Verfasst: 28. Oktober 2004 13:31
von lepsai
probier mal das:

Code: Alles auswählen

class MyCanvasItem : public QCanvasRectangle
{
MyCanvasItem(QCanvas * c,const QPixmap & toDraw) : QCanvasRectangle(c)
{
setSize( toDraw.width(), toDraw.height());
m_myPixmap = toDraw;
}

protected:
void drawShape( QPainter & p)
{
p->drawPixmap(x(),y(), m_myPixmap)
}

QPixmap m_myPixmap;
};

Verfasst: 29. Oktober 2004 14:21
von JulesBashir
Also bei mir kommen jetzt (nach einigen anderen, die behoben wurden) nun diese Fehler:

ApplicationWindow.o(.text+0x9d10): In function `MDIWindow::MDIWindow[not-in-charge](QWidget*, char const*, int)':
: undefined reference to `MyCanvasItem::MyCanvasItem[in-charge](QCanvas*, QPixmap const&)'
ApplicationWindow.o(.text+0xa2e0): In function `MDIWindow::MDIWindow[in-charge](QWidget*, char const*, int)':
: undefined reference to `MyCanvasItem::MyCanvasItem[in-charge](QCanvas*, QPixmap const&)'
ApplicationWindow.o(.text+0xb737): In function `MDIWindow::load(QString const&)':
: undefined reference to `MyCanvasItem::setPixmap(QPixmap const&)'
collect2: ld returned 1 exit status
make: *** [test_voting] Fehler 1

Naja, mal schaun...

Falls einer eine Idee hat, werfe den ersten Stein...

Verfasst: 4. November 2004 04:51
von Amadeus
Hi,
ich programmier schon seit ein paar Jahren mit Qt und würde dir vorerst mal von der Verwendung von QCanvas abraten.
Um Dein Problem lösen zu können, müsstest Du aber mal ein bischen genauer beschreiben, worum es sich handelt.

Also:
- Müssen die Bilder sozusagen in Echtzeit "gezoomt" werden?
- Sind es viele Bilder?
- Sind es mehrere Bilder in einem Widget, die sich evt. auch noch überlagern?
- Wie gross sind die Bilder, kann man die Grösse abschätzen?

Eine Andere Möglichkeit wäre nämlich, von deinem anzeigenden Widget die paintEvent() Funktion zu überschreiben,
und dann malst du da das Bild einfach größer oder kleiner rein
[ siehe: QPainter::scale() & QPainter::drawPixmap() ].
Was sich natürlich bei sehr grossen Bildern nicht so gut macht. Aber dazu evt. später mehr.

Verfasst: 4. November 2004 15:25
von lepsai
Vergiss QCanvas und benutze QScrollView.
Eine sehr effiziente Darstellung kann durch Überladen von viewportPaintEvent() erreicht werden...

Verfasst: 10. November 2004 16:40
von JulesBashir
Danke für die vielen Tipps.
Wie zeige ich denn etwas in dem ScrollView an?
Muss ich mir da ne Klasse schreiben, oder kann ich das so als normales Objekt benutzen?

Danke.

Verfasst: 10. November 2004 16:53
von lepsai
um irgendwas in den ScrollView zu zeichnen, musst die viewportPaintEvent() überladen und in dieser zeichnen. Alternativ kann man drawContents() überladen, aber sie ist langsamer. Das Zeichnen selbst übernimmt das Painter, z.B:

QPainter p(this);
p.drawPixmap(0,0, myPixmap);

zoomen wäre dann möglich mit:

p.scale(4.0, 4.0);
QPainter p(this);
p.drawPixmap(0,0, myPixmap);

nicht vergessen die Größe deiner Szene mit resizeContents() zu setzen.

Viel Erfolg!