Seite 1 von 1

Auf Bild in Pixmap zeichnen

Verfasst: 6. April 2009 19:46
von Der Mann aus der Kugel
hi zusammen,

ich setze eine pixmap in einem label und lade ein bild rein. klappt perfekt. code ist:

Code: Alles auswählen

void hauptfenster::karte_zeigen() {

	QImage img("ornder/bild.bmp");
	gurks->setPixmap(QPixmap::fromImage(img));
	gurks->show();	
}
jetzt würde ich gerne mit einem painter darauf etwas zeichnen, linien und rechtecke. ich weiß prinzipiell wie das geht, abe ich stecke seit tagen in so einer denk-sackgasse. kann mir vielleicht grad jemand einen strich oder ein rechteck auf das bild in dem label zeichen?

vielen dank im voraus!!!

Verfasst: 6. April 2009 22:46
von solarix
Habe ich noch nie gemacht, aber wenn ich mich durch die Doku klicke finde ich:
QImage->paintEngine()->drawRects (.....)

Hast du's mal damit versucht?

Verfasst: 6. April 2009 22:48
von upsala
Ich würde einfach mal einen QPainter auf das QPixmap/QImage öffnen...

Verfasst: 7. April 2009 17:46
von Der Mann aus der Kugel
upsala hat geschrieben:Ich würde einfach mal einen QPainter auf das QPixmap/QImage öffnen...
und wie meinst du das? genau das ist der punkt bei mir hehe

Verfasst: 7. April 2009 19:06
von upsala

Code: Alles auswählen

QPixmap pix(100, 100);
QPainter p(&pix);
p.drawLine(0, 0, 100, 100);
p.end();
label->setPixmap(pix);

Verfasst: 7. April 2009 19:46
von Der Mann aus der Kugel
Das geht leider völlig daneben:

Code: Alles auswählen

QPixmap pm(800,800);
pm.fill();
QImage img("dumdidum/ausschnitt.bmp");

QPixmap pix(800, 800);
QPainter p(&pix);
p.drawLine(0, 0, 10, 100);
p.end();

gurks->setPixmap(QPixmap::fromImage(img));
gurks->setPixmap(pix);

gurks->show();
ergibt ein komplett schwarzes feld...

Verfasst: 7. April 2009 20:25
von upsala

Code: Alles auswählen

// Wir erstellen ein neus QPixmap
QPixmap pm(800,800);  
// Wir füllen es mit weißer Farbe. Warum Weiß? => Doku
pm.fill(); 

//Wir laden ein Bitmap (wer benutzt eigentlich noch diese Format?!?)
QImage img("dumdidum/ausschnitt.bmp"); 

//Wir erstellen wieder ein QPixmap. Wir müssen ja Speicher haben... 
QPixmap pix(800, 800); 
//Wir öffnen einen QPainter auf unser QPixmap, klar wir wollen ja auch malern...
QPainter p(&pix); 
//Eigentlich sollten wir hier unser QPixmap initalisieren, aber das war ja auch nur Democode um das Prinzip zu zeigen
//Wir zeichnen eine Linie, Farbe=>Doku, Style=>Doku
p.drawLine(0, 0, 10, 100); 
//QPainter wieder schließen, schließlich wollen wir unser QPixmap für was anderes verwenden..
p.end(); 

//Wir setzen bei einem QLabel ein QImage, äh, QPixmap... Das würde auch mit weniger Code gehen => Doku 
gurks->setPixmap(QPixmap::fromImage(img)); 
//Und jetzt setzen ein anders QPixmap, warum dann die vorherige Codezeile?
gurks->setPixmap(pix); 
 
gurks->show();
Ja, mir war gerade langweilig, aber du solltest nicht jeden Beispielcode ohne mal die Doku zu konsultieren übernehmen.

Verfasst: 7. April 2009 20:31
von franzf
Und warum wundert dich das?!?
Dein geposteter Code wird nicht kompilieren, da "pix" nicht existiert. (sry, existiert scheinbar doch, zu flott gelesen...)
Des weiteren müsste das Bild weiß sein, da du fill() ohne Parameter aufrufst.
Und du malst nicht über ein Pixmap, wenn du ein weiteres Pixmap deinem Label zuweist.

Folgender Code funktioniert bei mir ganz prächtelig.

Code: Alles auswählen

#include <QtGui>

int main( int argc, char **argv )
{
    QApplication app(argc, argv);
    QPixmap pix( "test.png" );
    QPainter p( &pix );
    p.drawLine( QLine(pix.rect().topLeft(), pix.rect().bottomRight()) );
    p.end();
    QLabel l;
    l.setPixmap(pix);
    l.show();
    return app.exec();
}
Er zeichnet mir mein Pixmmap mit einer diagonalen Linie von links oben nach rechts unten.

Was auch klappen sollte (und in meinen Augen eleganter ist), wenn du von QLabel erbst und im paintEvent() erst QLabel::paintEvent() aufrufst, und danach auf "this" deine Zeichenoperationen durchführst.