Seite 1 von 1

picking in graphicsscene

Verfasst: 29. Mai 2010 20:22
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);
}

Verfasst: 29. Mai 2010 20:33
von Christian81
addPath() erzeugt ein QGraphicsPathItem, kein QPainterPath...

Verfasst: 29. Mai 2010 20:33
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;

Verfasst: 29. Mai 2010 20:54
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 ?

Verfasst: 29. Mai 2010 20:57
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?

Verfasst: 29. Mai 2010 21:16
von jaronimo
achso, tut mir leid. denkfehler meinerseits, auf grund von mangel an map erfahrung ;)

danke nochmal für deine zeit!