picking in graphicsscene

Alles rund um die Programmierung mit Qt
Antworten
jaronimo
Beiträge: 13
Registriert: 29. April 2010 19:00

picking in graphicsscene

Beitrag von jaronimo »

ich schreibe gerade an einem programm mit einer graphicsscene. in dieser graphicsscene wird ein graph angezeigt, der sich aus mehreren qpainterpaths zusammensetzt.

was ich nun gerne tun würde:
bei mouse-click auf einen qpainterpath herausfinden, über welchem qpainterpath die maus sich gerade befindet. (ich würde die qpainterpath klasse erweitern um ein attribut "qstring name" und so könnte ich dann den namen des qpainterpath auslesen)

ich hab mir das ganze so vorgestellt:
bei mouseclick lese ich die graphicsscene-position des zeigers aus (schon implementiert). diese position füttere ich an die itemAt() funktion, die mir dann das oberste item an dieser stelle zurückliefert.

woran es im moment scheitert, ist das casten item > painterpath.

kann mir jemand sagen, was ich falsch mache? oder bin ich mit dieser herangehensweise überhaupt am holzweg? aber wie sonst soll ich das picking in der graphicsscene implementieren?

Code: Alles auswählen

void GraphicsScene::mousePressEvent( QGraphicsSceneMouseEvent * mouseEvent )
{
	QTransform trans;
	//QGraphicsItem *item = itemAt(mouseEvent->scenePos(), trans);
	//QPainterPath path = QPainterPath qgraphicsitem_cast(  item );
	QPainterPath *item = dynamic_cast<QPainterPath *>(itemAt(mouseEvent->scenePos(), trans));
	if(item != 0)
	emit mousePos(item->name);
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

addPath() erzeugt ein QGraphicsPathItem, kein QPainterPath...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wie bitte soll das funktionieren? QPainterPath erbt nicht von QGraphicsItem. Der einzige cast, der ginge, wäre einer nach QGraphicsPathItem. Daraus kannst du dir dann deinen path() holen. Aber bitte prüfe den Rückgabewert auf NULL! Sonst stehst du gleich wieder hier und sagst "Ich krieg nen SegFault" :P
Und ableiten würde ich hier auch nicht. Pack doch das Item + name als pair in eine map:

Code: Alles auswählen

QMap<QGraphicsItem*, QString> itemToNameMap;
jaronimo
Beiträge: 13
Registriert: 29. April 2010 19:00

Beitrag von jaronimo »

danke für die schnellen antworten!
das mit der map ist ein sehr guter tip! und der hinweis auf den returnwert von addpath() hat mir auch geholfen.

wie kann ich dann 2 QGraphicsPathItems vergleichen (für den lookup in der hashmap)? einfach mit A == B ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

jaronimo hat geschrieben:wie kann ich dann 2 QGraphicsPathItems vergleichen (für den lookup in der hashmap)? einfach mit A == B ?
Versteh ich leider nicht...
Mit der Map (statt Ableiten) wird aus dem

Code: Alles auswählen

QString pathName = myPathItem->name();
einfach

Code: Alles auswählen

QString pathName = mapItemToName[myPathItem];
Und was willst du jetzt genau vergleichen?
jaronimo
Beiträge: 13
Registriert: 29. April 2010 19:00

Beitrag von jaronimo »

achso, tut mir leid. denkfehler meinerseits, auf grund von mangel an map erfahrung ;)

danke nochmal für deine zeit!
Antworten