Seite 1 von 1

Problem mit Schleife, qgraphicsitem_cast

Verfasst: 10. Januar 2009 11:29
von konvex
Hallo,
ich hab ein problem mit einer schleife. ich erstelle punkte und und will diese nun mit linien verbinden. mein programm funktioniert zwar, aber wenn ich zb. 20 punkte male und 2 davon verbinden will, kommen plötzlich 20 linien. dh. wenn ich auf einen punkt klick wird er mit allen punkten die sonst noch existieren verbunden obwohl ich nur eine linie will.
kann mir jemand sagen was ich falsch gemacht hab???

Code: Alles auswählen

for( int  i = 0; i < liste.size(); ++i)
{
   for(liste.begin(); !liste.isEmpty(); liste.removeAt(i))
   {
	if(EllipseItem* item = qgraphicsitem_cast<EllipseItem*>(liste[i]))
  	{
	     if(item==0)
	     { liste.removeAt(i); }

	      else
	      {
              linie = new LineItem(item,item2);
              ...//hier: verbinden mit signalen
	      addItem(linie);
              }
  	}
   }

if(liste.isEmpty())
{ addItem(item2); }

Verfasst: 10. Januar 2009 17:23
von Christian81
Was willst Du mit den beiden Schleifen überhaupt erreichen?

Verfasst: 11. Januar 2009 12:48
von konvex
Nun ich kann ja bereits 2Punkte mit EINER linie verbinden. jetzt will ich aber das ich auch eine 2.linie von einem punkt aus ziehen kann.
dazu hab ich die schleife damit erstmal abgefragt wird ob an der stelle auf die ich klick eine ellipse ist(es kann ja auch eine linie sein), und falls ja dann soll die 2.linie gezeichnet werden.
ich hab leider keine idee was falsch ist oder wie ich es umschreiben müsste!?

Verfasst: 12. Januar 2009 16:25
von Christian81
Sorry, aber die beiden Schleifen kapiere ich überhaupt nicht. Du hast zwei Schleifen die beide über die gleiche Liste gehen und die eine modifiziert die Liste auch noch - das ist mir irgendwie zuviel...

Verfasst: 12. Januar 2009 18:44
von franzf
Erm, ja...
Die erste Schleife geht von 0 bis size().. Du startest bei dem index "i=0".
Die zweite Schleife startet bei begin() (ist wohl das erste ELement -> index=0) und solange die Liste nicht leer ist, machst du removeAt(i). Wenn sie leer ist (size()=0), bist du mit dem ersten (!!!) Durchlauf durch, und setzt dann fort mit i=1, was allerdsings bei der zweiten Schleife (die mit begin()) sofort wieder abbricht, da die Liste leer ist!!!!!!!
Im übrigen ist die zweite Shclife unsinnig, da du immer nur mit dem Index i deine Elemente holst...

Naja, ist wohl ein Algorithmus fürn Popo :P

Schau dir mal das Elasticnodes-Example an (qt4-src/examples/elsaticnodes), der macht auch Ellipsen mit Linien, vllt. ist das eine Hilfe.

Grüße
Franz

Verfasst: 12. Januar 2009 20:20
von konvex
hm...ja :roll: stimmt, aber ich weiß nich wie ich meine schleife(n) bauen muss damit das funktioniert, also damit ich nen punkt(der schon mit ner linie verbunden ist ) mit ner 2.linie verbinden kann...
das elastic nodes beispiel hatte ich mir auch schon angeguckt.
könnt ihr mir vielleicht aus die sprünge helfen :oops: ?

Verfasst: 12. Januar 2009 22:02
von franzf
Überleg dir zu allererst, wie das Programm reagieren soll, bzw. wie sich der User denkt dass es auf seine EIngaben reagiert.
Also überleg dir, ob du mit nem Rechtsklick auf eine Ellipse auch gleich weißt, mit welchen anderen Ellipsen diese verbunden werden soll ;)
Da du über alle Items in der Liste läufst, sieht es so aus als wolltest du das Item mit allen bereits exisitierenden Ellipsen mit ner Linie verbinden. Deine Beschreibung sagt aber, dass du eine Ellipse mit einer anderen verbinden willst.
Also sei dir erst selber klar, was du willst.

In jedem Fall versteh ich nicht, warum du in der Liste immer items entfernen willst (liste.removeAt()).

Ich denke, du solltest deiner Scene mehrere "Modes" spendieren. SO was wie "AddEllipse, RemoveEllipse, ConnectEllipses". Dann kannst du immer genau richtig auf deinen Mausklick reagieren.

Für "ConnectEllipses" würde ich dann bei jedem Klick schauen, ob an der Position ein EllipseItem steckt. Falls ja, merk ich mir das, setze einen bool "foundFirst" auf true, und warte auf den zweiten Klick. Kommt da dann wieder ein EllipseItem, hab ich beide, erzeug ne Linie, setze die Pointer in meinem keyPressEvent auf NULL und foundFirst auf false - auf ein neues Beginnen.

Die Modes kannst du dann per ToolButton/RadioBox/... aktivieren.

Natürlich kannst du das alles auch mit Rechts/Linksklick anstellen, wird aber eine kleines Stück unübersichtlicher (nicht viel ;))

Grüße
Franz