Seite 1 von 1

Probleme beim Zeichnen von QImages auf dem Bildschirm

Verfasst: 22. November 2007 10:07
von mcbeth
Hi,
ich arbeite gerade an einer grafischen Anwendung, die mehrere Zeichenebenen übereinandergelegt ausgibt.
Ich hab das Problem jetzt mal auf eine von QWidget abgeleitete Klasse heruntergebrochen und das Problem taucht immernoch auf.
Also. Im PaintEvent werden mehrere (hier zwei) QImages gerendert, die anschließend mit einem QPainter einfach übereinandergezeichnet auf dem Monitor ausgegeben werden. (deswegen ARGB Format)
Nun zum Problem:
Wenn man nun dieses Fenster mit der Maus kleiner zieht, werden plötzlich irgendwelche zusätzlichen Linien und Punkte mit unterschiedlichen Farben gezeichnet.
Ich arbeite auf X11 mit Suse Linux (Qt 4.3.2). Wenn ich das Programm auf einer 64-Bit Maschine kompiliere, ist das Problem noch viel gravierender.
Wenn ich allerdings nur ein Image ausgebe, und den Hintergrund mit fillRect() schwarz mache, entsteht das Problem nicht. Lasse ich allerdings fillRect weg, ist das Problem wieder da.
Hier ist der Test Code des PaintEvents:

Code: Alles auswählen

void gui_test::paintEvent( QPaintEvent * )
{
	QSize si = this->size();
	QRect re = this->rect();

	//1. Image rendern
	QImage scrImage1(si,QImage::Format_ARGB32);
	QPainter iPainter1;
	iPainter1.begin(&scrImage1);

	//iPainter1.fillRect(re,Qt::black);
	iPainter1.setPen(QPen(Qt::blue,2,Qt::SolidLine));
	iPainter1.drawLine(QPoint(0,0),QPoint(si.width(),si.height()));
	iPainter1.setPen(QPen(Qt::red,1,Qt::SolidLine));
	iPainter1.drawLine(QPoint(0,si.height()),QPoint(si.width(),0));

	iPainter1.end();

	//2.Image rendern
	QImage scrImage2(si,QImage::Format_ARGB32);
	QPainter iPainter2;
	iPainter2.begin(&scrImage2);

	iPainter2.setPen(QPen(Qt::green,3,Qt::SolidLine));
	iPainter2.drawLine(QPoint(0,si.height()/2),QPoint(si.width(),si.height()/2));
	iPainter2.setPen(QPen(Qt::yellow,5,Qt::DotLine));
	
Painter2.drawLine(QPoint(si.width()/2,0),QPoint(si.width()/2,si.height()));
	iPainter2.end();

	//beide Images auf den Bildschirm malen
	QPainter scrPainter(this);
	scrPainter.drawImage(QPoint(0,0),scrImage1);
	scrPainter.drawImage(QPoint(0,0),scrImage2);

};
Hat jemand eine Idee, wie ich dieses Problem beheben kann?

P.s.:Das mit dem Painter.begin() und .end() hab ich nur mal ausprobiert, das geht auch direkt im Kontruktor des Painters.

Verfasst: 22. November 2007 10:27
von Christian81
Schiebe die ganze Berechnung mal aus dem PaintEvent raus und erzeuge ein QImage/QPixmap welches dann später beim PaintEvent ausgegeben wird.
Berechnungen innerhalb des PaintEvents sollten wenn möglich vermieden werden.

Verfasst: 22. November 2007 11:10
von mcbeth
Vielen Dank für die schnelle Antwort.
Ich hab das Berechnen der QImages quit and dirty in einen anderen Thread geschoben.
Die Kommunikation läuft über Signal/Slot. Thread läuft auch.
Allerdings verschwindet der Fehler leider nicht.
Es ist echt komisch. Ich hab das Gefühl, dass da irgendein Überlauf mitgerendert wird.

Nachtrag:
Scheinbar werden die neuen Punkte "zwischen" den Ebenen gezeichnet,
denn, wenn ich in einer Ebene den hintergrund schwarz fülle, erscheinen keine Fehler mehr.

Ich hab grad auch mit dem CompositionMode und QImage::Format_ARGB32_Premultiplied oder QImage::Format_ARGB32 rumprobiert. Hilf alles nix.

Noch Einfälle?

Verfasst: 22. November 2007 12:12
von Christian81
Jetzt sehe ich es - Du benutzt kein fill(). Ein QImage(x,y) erzeugt zwar ein Image, die Bilddaten darin sind aber uninitialisiert.

[gelöst] Probleme beim Zeichnen von QImages auf dem Screen

Verfasst: 22. November 2007 12:45
von mcbeth
Oh vielen Dank!
jetzt funktionierts. Ich dachte er macht das automatisch.
Komisch ist nur, dass es bei größeren Bildern funktioniert.
Egal, klappt.
vielen vielen Dank