QRegion in QGraphicsItem konvertieren(oder vergleichbares)

Alles rund um die Programmierung mit Qt
Antworten
samsamsam
Beiträge: 43
Registriert: 9. Juni 2009 16:22
Wohnort: Dortmund

QRegion in QGraphicsItem konvertieren(oder vergleichbares)

Beitrag von samsamsam »

Hallo,

ich habe ein (größeres) Problem mit meiner GraphicsView/GraphicsScene.

Und zwar ist es so, dass der Aufbau der View und die resize-Aktionen sehr sehr lange dauern.

Der Tipp, der mir gegeben wurde : myView->setViewpor(new QGLWidget()); kann ich nicht umsetzen, da ich eine kommerzielle Lizenz habe, die sich nur auf die GUI beschränkt. Demzufolge kann ich QGLWidget nicht benutzen.

Da ich in meiner Scene ein Koordinatensystem mit im Schnitt einer Million Punkte darstellen möchte, ist die View sehr sehr langsam.

Ich hatte die Idee, dass ich die Punkte, die sich überschneiden oder berühren zusammenfasse zu einem Polygon.

Code: Alles auswählen


QList <QPolygonF*> list;

for(long int i = 0;i<1000000;i++)
	{
		//zufällig ausgewählte punkte zu testzwecken
		x1 = rand()*y1;
		y1 = rand()*x1;
		if(x1<1500)
			x1 = 1500 + ((rand()*y1)%1000);
		else x1 = x1 % 2500;

		if(y1<1500)
			y1 = 1500 + ((rand()*x1)%1000);
		else y1 = y1 % 2500;

	
//der neue punkt
		QPolygonF newPoint(QRectF(x1,y1,3,3));
		

		//case 1: QGraphicsItemGroup* ist leer;
		if(list.isEmpty())
		{

			QPolygonF * g = new QPolygonF(newPoint);
			
			
			list.append(g);
		}


		//case 2:liste nicht leer
		else
		{
			//bestimme ob polygon anere polygone schneidet und //somit mit einem anderen Polygon vereinigt werden kann

			int g = 0;
			bool intersects = false;
			while(g<list.size() && !intersects)
			{
	
				if(list.at(g)->boundingRect().intersects(newPoint.boundingRect()))
				{
					intersects = true;
					QPolygonF * re = new QPolygonF(list.at(g)->united(newPoint));
					list.replace(g,re);
				}
			
				g++;
			}
			
			//falls es kein polygon in der liste schneidet
			if(!intersects)
			{
				QPolygonF * g = new QPolygonF(newPoint);
				list.append(g);
			}
			
		}
	
		
		
	}

//jetzt polygone in die scene einfügen
while(!list.isEmpty())
	{
		
		myScene->addPolygon(*list.at(0));
		list.removeAt(0);
		
	}

wie man unschwer erkennen kann, dauert das eingeben von punkten ewig lange, ständig polygone vereinigt und in der liste die replace-vorgänge stattfinden. nachdem die schleife abgearbeitet ist, gefühlte 2 jahre später, dauert der aufbau der view sehr sehr lange....
ich denke wenn anstatt QPolygonF man QRegion benutzen würde, wäre es um einiges schneller, sowohl das eingeben von punkten als auch der aufbau der viel, weil es dann erheblich weniger items gäbe in der scene.
Leider hab ich keine weg gefunden, um QRegion in QGraphicsItem umzuwandeln, damit es dann in die Scene eingefügt werden kann.

Fall jemand weiß wie es geht oder einen anderen konstruktiven Vorschlag zur optimierung hat, wäre ich sehr dankbar.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Es ist relativ leicht von QGraphcsItem abzuleiten und ein eigenes Item zu erstellen, daß eine QRegion zeichnen kann.

Allerdings frage ich mich, was du wirklich vor hast.
Antworten