Auf Bild in Pixmap zeichnen

Alles rund um die Programmierung mit Qt
Antworten
Der Mann aus der Kugel
Beiträge: 10
Registriert: 6. April 2009 18:20

Auf Bild in Pixmap zeichnen

Beitrag 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!!!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich würde einfach mal einen QPainter auf das QPixmap/QImage öffnen...
Der Mann aus der Kugel
Beiträge: 10
Registriert: 6. April 2009 18:20

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

QPixmap pix(100, 100);
QPainter p(&pix);
p.drawLine(0, 0, 100, 100);
p.end();
label->setPixmap(pix);
Zuletzt geändert von upsala am 7. April 2009 19:57, insgesamt 1-mal geändert.
Der Mann aus der Kugel
Beiträge: 10
Registriert: 6. April 2009 18:20

Beitrag 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...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

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