Seite 1 von 1

[Gelöst] QGraphicsEllipseItem Skalierung anpassen

Verfasst: 12. Juli 2010 09:52
von abcmann74
Hi

Ich habe folgendes Problem:

In meine QGraphicsScene zeichne ich QGraphicsEllipseItem's als Punkte ein:

Code: Alles auswählen

QGraphicsEllipseItem *point = addEllipse(x-3,y-3,6,6,Qt::SolidLine,Qt::SolidPattern);
Diese QGraphicsScene zeige ich dann über ein QGraphicsView an. Was ich erreichen will ist, dass die "Punkte" mitskaliert werden. Sie sollen sich der aktuellen Zoomstufe anpassen. Das heißt wenn ich in meinen QGraphicsView so weit skaliert habe, dass ich die einzelnen Pixel der QGraphicsScene sehen kann, sollen die Punkte auch nur noch ein Pixel groß sein. Wenn ich hingegen die ganze GraphicScene sehe, sollen die Punkte wieder größer werden, damit ich sie auch sehen kann.
Ich habe es schon mit den horizontalen und vertikalen Skalierungsfaktoren (m11 und m22) aus der Transformationsmatrix probiert. Leider ohne Erfolg.
setFlags(QGraphicsItem::ItemIgnoresTransformations) hat mir auch nicht weiter geholfen.

Für jede Hilfe wäre ich sehr dankbar.

Verfasst: 15. Juli 2010 15:06
von abcmann74
kann mir keiner weiterhelfen?
grüße

Verfasst: 15. Juli 2010 15:42
von franzf
QGraphicsView macht eigentlich per Default GENAU DAS was du willst, drum versteht wohl hier niemand dein Problem...
view.scale(2,2) z.B. vergrößerst die Ansicht um Faktor 2, alle Items (dazu zählen auch EllipseItems) werden doppelt so groß gezeichnet.
QGraphicsItem::ItemIgnoresTransformations hingegen VERHINDERT, dass das Item die Transormation annimmt. Bei obigem Zoom wird das Item nicht um Faktor 2 vergößert, sondern bleibt immer gleich groß (in sichtbaren "Monitorpixeln" gemessen).

Wenn das immer noch nicht hilft, solltest du ein minimales, kompilierbares Beispiel posten, welches dein Problem deutlich macht.

Verfasst: 16. Juli 2010 12:46
von abcmann74
danke für deine antwort franzf. ich glaube ich habe das problem nicht richtig erklärt.

Was ich schon mache:
Ich füge QGraphicsEllipseItem's einer QGraphicsScene hinzu. Ich skaliere den QGraphicsView um eine Zoomfunktion zu realisieren.

Was ich will:
Beim rein zoomen sollen die QGraphicsEllipseItem's auch kleiner werden (und nicht größer - wie bei der default einstellung). Beim raus zoomen sollen die Punkte wieder größer werden.

Lösung (bin ich eben selber drauf gekommen):
Bei jedem skalieren des QGraphicsView, suche ich mir alle QGraphicsEllipseItems (alle mit dem Z-Wert 1) und skaliere diese auf den Skalierungskaftor m11 aus der Transormationsmatrix. Das sieht dann ungefähr so aus:

Code: Alles auswählen


void ImageWindow::ScaleImage(double factor, QPointF P)
{
	QTransform matrix = View_->transform();
	ScaleFactor_ = matrix.m11();

	View_->centerOn(P);
	View_->scale(factor,factor);
	View_->centerOn(P);
	
	QList<QGraphicsItem *> list = this->items();

	for (int i = 0; i < list.size(); i++)
	{
		if(list[i]->zValue()==1)
		{
			list[i]->setScale(1/ScaleFactor_); 
		} 
	}
}

Das funktioniert recht gut.
grüße