[gelöst]collidingItems aussortieren

Alles rund um die Programmierung mit Qt
Antworten
toba
Beiträge: 28
Registriert: 22. September 2011 09:28

[gelöst]collidingItems aussortieren

Beitrag von toba »

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)

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;
        }
}
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?
Zuletzt geändert von toba am 30. September 2011 09:06, insgesamt 1-mal geändert.
dennisDennis
Beiträge: 17
Registriert: 23. September 2011 16:21

Re: collidingItems aussortieren

Beitrag von dennisDennis »

Du kannst deine Liste filtern.

QList<QGraphicsIitem>gefiltert;

foreach(QGraphicsItem* gi, collidingItems(Item)
{
if(gi->type() == QGraphicsPolygonItem::RTTI )
{
gefiltert.append(gi);
}
}
toba
Beiträge: 28
Registriert: 22. September 2011 09:28

Re: collidingItems aussortieren

Beitrag von toba »

So, mal wieder Herzlichen Dank!

RTTI gibts bei QT4 nichtmehr (nur in den Qt3 beschreibungen gefunden?), kann man aber durch Type ersetzen, hier mal wie ichs nun gemacht habe:

Code: Alles auswählen

QList <QGraphicsItem *> itemlistFilter;
  foreach (QGraphicsItem* gi, collidingItems(Item))
    {
         if (gi->type()==QGraphicsPolygonItem::Type)
    {
   itemlistFilter.append(gi);
Antworten