Problem mit Schleife, qgraphicsitem_cast

Alles rund um die Programmierung mit Qt
Antworten
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Problem mit Schleife, qgraphicsitem_cast

Beitrag 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); }
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was willst Du mit den beiden Schleifen überhaupt erreichen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag 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!?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

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

Beitrag 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
konvex
Beiträge: 35
Registriert: 8. November 2008 17:58

Beitrag 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: ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Antworten