Seite 1 von 1

QPixmap oder QPainter zoomen

Verfasst: 1. Dezember 2004 14:43
von JulesBashir
Hallo!

Ich möchte mein Bild (als QPixmap oder QImage oder QPainter) zoomen. Mit den .scale(...)-Methoden geht das auch schon für eine Stufe. Ich möchte aber auch noch weiter/tiefer zoomen. Irgendwie klappt das aber nicht:-( Bisher geht nur einmal rein und einmal raus. Danach ist Schluß (bei QPixmap/QImage/QPainter). Kann mir einer sagen, wie ich dies hier verändern muss:

void MDIWindow::paintPixmap(double &zoomFactor){
// Zoomfunktionen
if ( !f.open( IO_ReadOnly ) )
return;
if(filename.contains(".bmp") || filename.contains(".BMP")) {
tmp->setMaximumHeight(0);
tmp->setMaximumWidth(0);
setFocusProxy(tmp);
setCentralWidget(tmp);
qp.load(filename);
qp.resize((int)(100*zoomFactor) +qp.width(),(int)(100*zoomFactor)+qp.height());
qi.load(filename);
painter.begin(this);
painter.eraseRect (0,0, w, h );
w = (int)(qi.width()*zoomFactor/100);
h = (int)(qi.height()*zoomFactor/100);
qi = qi.scale(w,h);
painter.drawImage (0, 0, qi);
painter.end();
tmp->repaint();
tmp->show();
}
}

Danke schonmal.
MfG JulesBashir

Verfasst: 1. Dezember 2004 15:03
von JulesBashir
Hat sich erledigt...:-)
Ich hab jetzt eine Woche rumgerätselt, warum das nicht ging... Jetzt direkt nach dem Beitrag habe ich die Lösung, war ja klar...:-/
Ich habe den zoomFactor vergessen mit heraufzusetzen.

Verfasst: 1. Dezember 2004 15:03
von lepsai
Hmm..

Erstmal solltest du die Logik in deiner Anwendung überdenken...
Das Laden von Bildern hat in einer paint()-Funktion nix verloren...

Damit hängen letztendlich auch deine Probleme zusammen. Dadurch, dass du das Bild immer wieder neu lädst, wird das zuletzt sklalierte Bild nicht abgespeichert. So kommt es immer nur zu einem Zoom.

Eine Lösung wäre:

1) Lade das Bild.
2) Konvertiere es zu einem Pixmap
3) Mach dieses Pxmap zu der Klassenvariable deiner Darstellungsklasse QWidget oder QScrollView
4) in der paintEvent() oder viewportPaintEvent() :

QPainter p(this);
QWMatrix m;
m.scale(m_zoom, m_zoom);
p.setWorldMatrix(m); oder p.scale(m_zoom, m_zoom);

5) implementiere den Slot: setZoom(double zoom){ m_zoom = zoom; repaint(false);
}