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();
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.