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?