Seite 1 von 1

Problem mit Text in QGraphicsview

Verfasst: 26. Februar 2011 17:00
von MightTower
Hallo zusammen,
aufbauend auf dem QGraphicsview Diagramm Beispiel versuche ich Text an die Arrows zu schreiben, wenn ich es so machen klappt es auch:

Code: Alles auswählen

QPointF a=(line().p1()+line().p2())/2;
painter->drawText(a,"Test");
verusche ich es jedoch über:

Code: Alles auswählen

QPointF a=(line().p1()+line().p2())/2;
title->setPlainText("Test");
title->setPos(a);
klappt es nicht.
wobei title Im Konstruktor mit:
title=new QGraphicsTextItem;
initialisiert wird.
Habe auch shconmal setPos(0,0); versucht aber ohne Erfolg, scheinbar denk ich im flashcen Koordinatensystem oder muss ich nochirgendetwas aufrufen damit der Text auch gezeichnet wird?
Oder wo könnte noch einer entscheidender Unterschied zwischen beiden Vorgehensweisen liegen? BoundingRect oder so?
Vielen Dank
Marc

Verfasst: 26. Februar 2011 17:35
von franzf
1) falsches Koordinatensystem
2) dein TextItem ist in keiner Scene.

Koordinaten sind bezogen auf
* das parent, falls ein parent-item existiert (bei dir nicht)
* auf die scene() sonst.
Wenn du ein parent setzt, hat das Item automatisch auch eine scene.
Ansonsten musst du scene().addItem(title) hinzufügen. Pass aber bitte auf, dass scene() nicht NULL zurückliefert - dann bringt das addItem() gar nix - außer nen SegFault :P.

In deinem Fall denke ich aber, du willst eine parent<->child-Beziehung, da deine Klasse selber das title-Objekt verwalten will. Dafür zum Initialisieren einfach den passenden QGraphicsTextItem-Konstruktor wählen.

Verfasst: 26. Februar 2011 21:33
von MightTower
Danke das hat schonmal geholfen.
hier mal mein Code bisher:
Konstruktor:

Code: Alles auswählen

this->title=new QGraphicsTextItem(this);

Code: Alles auswählen

	int degree= (angle*180/Pi-180);
	title->setPlainText("Test");

	QPointF a=(line().p1()+line().p2())/2;
	
	title->setPos(a);

	title->setTransformOriginPoint(title->boundingRect().center());
	
	title->rotate(degree);
Was mich wundert ist das das setPos im Koordinatensystem der Scene abläuft und nicht in einem lokalen Koordinatensystem des Items.
Und wenn ich rotiere wird immer um die obere linke Ecke rotiert, auch wenn ich den Origin setze. Warum?
Und title->rotation gibt immer 0 zurück, das macht für mich auch irgendwie wenig Sinn auf den ersten Blick.
Das Problem was ich lösen will ist eigentlich das wenn der Pfeil einen gewissen Winkel hat der Text sich anpasst. Bisher hapert es wie gesagt am Drehpunkt und daran das Paint sehr oft aufgerufen wird und das jedesmal um degree weiter rotiert wird also sich das aufaddiert, aber ich denke das Problem kriege ich in den Griff, wenn ich den Rest verstanden habe.
Vielen Dank
Marc

Verfasst: 26. Februar 2011 22:21
von MightTower
habe es jetzt wie folgt hinbekommen:

Code: Alles auswählen

int degree= (angle*180/Pi-180);
	title->setPlainText("Test");

	QPointF a=(line().p1()+line().p2())/2;
	
	title->setPos(a);
	if (degree>90||degree<-90)
		degree+=180;
	
	title->setTransform(QTransform().translate(title->boundingRect().center().x(),title->boundingRect().center().y()).rotate(-degree).translate(-title->boundingRect().center().x(),-title->boundingRect().center().y()));
Also hat sich das Hauptproblem erstmal gelöst. Danke