QCanvas statt QPixmap (mit QLabel), um Bilder anzuzeigen

Alles rund um die Programmierung mit Qt
Antworten
JulesBashir
Beiträge: 5
Registriert: 20. Oktober 2004 14:14
Wohnort: Paderborn
Kontaktdaten:

QCanvas statt QPixmap (mit QLabel), um Bilder anzuzeigen

Beitrag 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.
QT? Is it QuickTime???
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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;
};
JulesBashir
Beiträge: 5
Registriert: 20. Oktober 2004 14:14
Wohnort: Paderborn
Kontaktdaten:

Beitrag 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...
QT? Is it QuickTime???
Amadeus
Beiträge: 3
Registriert: 4. November 2004 04:38
Kontaktdaten:

Beitrag 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.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Vergiss QCanvas und benutze QScrollView.
Eine sehr effiziente Darstellung kann durch Überladen von viewportPaintEvent() erreicht werden...
JulesBashir
Beiträge: 5
Registriert: 20. Oktober 2004 14:14
Wohnort: Paderborn
Kontaktdaten:

Beitrag 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.
QT? Is it QuickTime???
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

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