Seite 1 von 1

[gelöst] QPainter Koordinatensystem anpassen

Verfasst: 22. September 2005 13:47
von kowi1134
Hallo!

In meinem Programm benutze ich einen QPainter, der in einem QFrame zeichnen soll. Gibt es eine Möglichkeit, wie man diesem QPainter sagen kann, dass er den ihm zur Verfügung stehen Raum (sprich der Platz im QFrame) richtig nutzt?

Bei mir tritt folgendes Problem auf:
Wenn ich den Painter skaliere (mit QPainter::scale(int sx, int sy)) dann fasst dieser die angegebenen Koordinaten sx und sy anscheinend als Pixel auf. Man sieht dann beim Vergrößern des QFrames, dass der Painter in einem Bereich zeichnet, den man gar nicht gesehen hat als der QFrame noch kleiner war.

Muss ich den Viewport verändern? In der Doku steht nämlich, dass dieser standardmäßig auf den QPaintDevice (bei mir also auf den QFrame) eingestellt ist.


Der Code in meiner von QFrame abgeleiteten Klasse sieht wie folgt aus:

Code: Alles auswählen

QPainter painter;

	QMatrix  matrix;
	
	matrix.scale( fieldSize, max );

	painter.setRenderHint(QPainter::Antialiasing);

	painter.setPen( QPen(Qt::blue, 1) );

	painter.begin( this );
	painter.setMatrix( matrix );
	for ( unsigned long x = 0; x < fieldSize; x++ )
	{
		painter.drawPoint( x, data[x] );
	}
	painter.end();
Ciao

Verfasst: 22. September 2005 15:44
von kowi1134
Ok, ich bin auch ein Schussel! :?

So funktioniert's, einfach die größe des widgets durch die Anzahl der Elemente bzw. den größten Wert teilen:

Code: Alles auswählen

	QPainter painter;

	painter.setPen( QPen(Qt::red, 3) );

	painter.begin( this );
	painter.scale(
		(double)painterWidth/(fieldSize-1), 
		(double)painterHeight/max
	);
	for ( unsigned long x = 0; x < fieldSize; x++ )
	{
		painter.drawLine( x, 0, x, data[x] );
	}
	painter.end();

Verfasst: 25. April 2006 11:25
von Mamba
Hi,

ich habe ein ähnliches Problem. Und zwar habe ich ein Widget, auf das ich ein neues Widget klebe, welches von QWidget abgelitten ist. Auf dieses wird ein mit Vektorgrafik bemaltes QPicture gezeichnet.
Wenn ich scale auf (1.,1.) stelle, werden die Zeichnungen nicht 1:1 gezeichnet, sondern generell etwas größer. So ca. ein Faktor von 1,34. Ich kann mir das nicht erklären.
Nochmal zum besseren Verständnis:
Ich hole mir width und height vom Zeichen-Widget, zeichne dann ein

Code: Alles auswählen

QRectF (1., 1., (double) zeichenwidget->height() - 2., (double) zeichenwidget->width() - 2.);
Jetzt erwartet man ein Viereck, welches genau in den äußeren Rahmen des Widgets gezeichnet wird, oder? Allerdings ist dieses mit der linkgen oberen Ecke genau auf der linken oberen Ecke des Widgets (das erwartet man noch so), allerdings ist die rechte untere Ecke weit außerhalb des sichtbaren Bereichs. Das ganze habe ich nachgemessen, und es ergibts sich der oben genannte Faktor von ~1,34. Wo ist mein Denkfehler? :roll:

Ich verstehe in dem obigen Beispiel auch die Variablen nicht:

Code: Alles auswählen

painter.scale(
      (double)painterWidth/(fieldSize-1),
      (double)painterHeight/max
   ); 
was ist painterWidth und fieldSize? Bzw. painterHeight und max? :?:

Verfasst: 8. Mai 2006 11:11
von Mamba
Warum steht hier plötzlich gelöst im Topic? :roll:
Die Frage ist immernoch offen!