Seite 1 von 1

qgraphicsview viel zu langsam

Verfasst: 2. Juli 2009 14:28
von samsamsam
hallo allerseits.

ich bin dabei etwa 1 000 000 QRects (ca 10 mal 10 pixel breit/hoch) in eine QGraphicsScene unterzubringen. Die Rects sollen im Prinzip Punkte in einem Koordinatensystem darstellen. in der praxis werden zwischen 800 000 und 1500 000 punkte dargestellt werden müssen und das läuft soweit sehr sehr langsam....javascript:emoticon(':(')

Wenn das Widget, in dem die QGraphicsView untergebracht ist, seine Größe ändert, dauert es ewig lange, bis die GraphicsView seinen Inhalt zeichnet.

Code: Alles auswählen

myScene =  new QGraphicsScene(this);
myScene->setItemIndexMethod(QGraphicsScene::BspTreeIndex);

//größe der szene 3000 x 3000
myScene->setSceneRect(0,0,3000,3000);

myScene->setBackgroundBrush(QBrush(Qt::transparent));

//x & y axis
plotCartesianAxis(QSize(3000,3000));

	
// eine million QRects zur Stene hinzufügen
	for(long int i = 0;i<1000000;i++)
	{
		
		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;

	
		QRectF newPoint(x1,y1,10,10);
		
                  myScene->addRect(newPoint, QPen(Qt::blue), QBrush(Qt::blue)); 
	
		       
				
}		
	

	
       myView = new QGraphicsView(myScene);
	QHBoxLayout *l = new QHBoxLayout(this);
	l->addWidget(myView);
	l->setMargin(0);
	setLayout(l);

//die view so skalieren, dass die ganze scene sichtbar wird
QTransform t;
	myView->setTransform(t.scale(factorWidth, factorHeight));
	myView->show();


Ich füge also zu testzwecken 1000000 Punkte in die scene ein und lasse die scene über qgraphicsview anzeigen.

wenn das widget, das die view beinhalter seine größe ändert, braucht die graphicsview ewig, um die view neu darzustellen.

mach ich was falsch oder hab ich einen wichtigen schritt vergessen?


ich habe schon mal versucht, die qrects, die sich schneiden in QPolygonF zusammenzufassen, so dass letztenendes weniger items in der scene sind, das ist aber trotzdem noch viel zu langsam. :(

Verfasst: 2. Juli 2009 14:44
von Strahlex
Hast du schon versucht das GraphicsView mit OpenGL zu rendern?

Verfasst: 2. Juli 2009 14:45
von samsamsam
meinst du mit

Code: Alles auswählen

myView->setViewport(new QGLWidget());
???

Verfasst: 2. Juli 2009 14:50
von samsamsam
ich habe

Code: Alles auswählen

myView = new QGraphicsView(myScene);
	QGLWidget *w = new QGLWidget(this);
	myView->setViewport (w);
hinzugefügt aber da kommen lauter fehlermeldungen....

Code: Alles auswählen

1>c:\qt\4.5.1_vs2008\include\qtopengl\../../src/opengl/qglcolormap.h(52) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'QtOpenGLModule'
1>c:\qt\4.5.1_vs2008\include\qtopengl\../../src/opengl/qglcolormap.h(52) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\qt\4.5.1_vs2008\include\qtopengl\../../src/opengl/qglcolormap.h(52) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\qt\4.5.1_vs2008\include\qtopengl\../../src/opengl/qgl.h(83) : error C2378: 'QtOpenGLModule': Neudefinition; Symbol kann nicht mit typedef überladen werden
1>        c:\qt\4.5.1_vs2008\include\qtopengl\../../src/opengl/qglcolormap.h(52): Siehe Deklaration von 'QtOpenGLModule'
1>.\sf_fldgraph.cpp(231) : error C2059: Syntaxfehler: '}'
Dabei hab ich nur #include <QGLWidget> hinzugefügt

Verfasst: 2. Juli 2009 15:26
von samsamsam
leider habe ich nur die gui-lizenz, kann also qglwidget nicht benutzen.

Verfasst: 2. Juli 2009 22:24
von Strahlex
Das GLWidget ist doch auch in der opensource Version dabei. Hast du eine komerzielle Lizenz?

Verfasst: 3. Juli 2009 08:47
von samsamsam
ja ich habe eine kommerzielle lizenz. keine volle sondern nur qt-gui

Verfasst: 3. Juli 2009 09:58
von Christian81
Wenn du eh eine kommerzielle Lizenz hast - frag doch einfach mal bei Trolltech nach ob sie Erfahrung mit so vielen Objekten haben.
Des weiteren ist Qt4.5 unter der LGPL verfügbar - du kannst sie also auch so nutzen solange du nicht statisch linkst. Und Testen kannst du auf alle älle mal mit der Opensource-Version ob es was bringt...

Verfasst: 3. Juli 2009 10:36
von samsamsam
ok danke ich versuch es mal mit trolltech kontaktieren