[gelöst]collidingItems aussortieren
Verfasst: 29. September 2011 15:27
Moin, hab mal wieder ein kleines Problem.
Habe auf meiner QGraphicsScene Rechtecke platziert und mit einem String beschriftet. Siehe hier:
http://www.qtforum.de/forum/viewtopic.php?f=1&t=14290
nun wollte ich, falls sich einige Rechtecke überschneiden, sie einfach verschieben. Ansatz mit ausführlichen Kommentaren ist hier:
(bevor ihr den Code lest (ist nicht wirklich notwendig), lest erst unten weiter)
Das Problem hierbei ist, das die Schrift natürlich auch als Kollision erkannt wird und sie mir auch verschoben wird. Dann sieht es immer so aus, das ich ein Rechteck habe, den Schriftzug, ein Rechteck, den Schriftzug... schön untereinander..
Daraus ergeben sich mir 2 Fragen:
1. Kann man die QList "filtern" nach (in dem Fall) QGraphicsTextItem und QGraphicsPolygonItem?
2. Das ganze sieht mir sehr unschön aus.. Viele Schleifen usw... Gibt es nicht eine einfachere/andere Möglichkeit soetwas umzusetzen?
Habe auf meiner QGraphicsScene Rechtecke platziert und mit einem String beschriftet. Siehe hier:
http://www.qtforum.de/forum/viewtopic.php?f=1&t=14290
nun wollte ich, falls sich einige Rechtecke überschneiden, sie einfach verschieben. Ansatz mit ausführlichen Kommentaren ist hier:
(bevor ihr den Code lest (ist nicht wirklich notwendig), lest erst unten weiter)
Code: Alles auswählen
void CMitte::LagenSortieren()
{
//Hier wird der Y-Wert Schrittweise von +400 auf -400 durchlaufen. Die mit ItemAt gewählten Items bekommen den Y-Wert als Z-Wert zugewiesen.
QGraphicsItem *Item; //Dieses Item wird dauernt benutzt um Items zwischenzuspeichern
for (int i=400; i!=-400; i--)
{
Item = itemAt(-50,i); //X-Pos muss um -50 versetzt ausgelesen werden, da bei 0,i die Schrift liegt
if (Item!=0)
Item->setZValue(-i);
else
continue;
}
//Nun wird, ausgehend von dem Item mit dem zValue Wert=0 (Mitte) die collision abgefragt. Bei Collision werden die mit dem Item kollidierenden Items
//um +1 bei Positiven zValue Werten, um -1 bei negativen zValue Werten verschoben, solange bis es keine kollisionen mehr gibt. nun folgt zValue=1... 400,
//danach -1...-400
QPointF Punkt;
int posX=0;
int posY=0;
QList <QGraphicsItem *> itemlist;
for (int i=0; i!=400; i++) //Zuerst die Items in positiver x-Richtung
{
Item = itemAt(-50,i);
if (Item !=0) //Nur wenn dort auch ein Item ist.
{
itemlist = collidingItems(Item); //Die Liste mit den Kollidierten Items erstellen
//Hier wird auch der Text als Kollision mit einbezogen :/
bool leer=true;
leer = itemlist.isEmpty();
if (leer==false) //Wenn die Liste nicht leer ist, dann:
{
int ArrayPos=0;
int Anzahl = itemlist.length(); // Es befinden sich o Zeiger auf GraphicItems in der Liste (erster zeiger ist an pos. 0)
ArrayPos = Anzahl-1; //erstes Rechteck wählen.. (-1 da QList bei Array 0 anfängt)
// Die Items befinden sich in der Reihenfolge, zValue am höchsten auf pos. 0.. usw.)
for ( ; ArrayPos!=-1; ArrayPos-- ) // Hier nur bis 0 und nich -1, da das oberste Item nicht verschoben werden soll
{
Punkt = itemlist[ArrayPos]->pos();
posX=Punkt.x();
posY=Punkt.y();
posY++;
itemlist[ArrayPos]->setPos(posX,posY);
}
}
}
else
continue;
}
}Daraus ergeben sich mir 2 Fragen:
1. Kann man die QList "filtern" nach (in dem Fall) QGraphicsTextItem und QGraphicsPolygonItem?
2. Das ganze sieht mir sehr unschön aus.. Viele Schleifen usw... Gibt es nicht eine einfachere/andere Möglichkeit soetwas umzusetzen?