[gelöst] QPainter Koordinatensystem anpassen

Alles rund um die Programmierung mit Qt
Antworten
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

[gelöst] QPainter Koordinatensystem anpassen

Beitrag 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
Zuletzt geändert von kowi1134 am 22. September 2005 15:44, insgesamt 1-mal geändert.
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag 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();
Mamba
Beiträge: 17
Registriert: 18. April 2006 11:41

Beitrag 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? :?:
Mamba
Beiträge: 17
Registriert: 18. April 2006 11:41

Beitrag von Mamba »

Warum steht hier plötzlich gelöst im Topic? :roll:
Die Frage ist immernoch offen!
Antworten