qgraphicsview viel zu langsam
Verfasst: 2. Juli 2009 14:28
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.
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.
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.