小さな次元でいくつかの QGraphicsitem を定義すると、たとえばメトリック ラインを同じ長さ (たとえば、数メートル) の QGraphicLineItems に直接変換すると、リダリング システム全体が非常に遅くなり、クラッシュすることさえあります。一方、項目が「大きい」(長さ > 100) 場合、問題は発生しません。
より具体的な例を挙げると、次のコードを使用して QGraphicItems をピックスマップに変換します。
QGraphicsPixmapItem* transformToPixmapItem(std::vector<QGraphicsItem>& items,int maxRes){
QRectF boundingRect;
boostForeach(QGraphicsItem* pItem,items) {
boundingRect = boundingRect.united(pItem->boundingRect());
}
QSize size(boundingRect.size().toSize());
double const scale = std::min(16.0,double(maxRes)/boundingRect.size().width());
QPixmap pixmap(size*scale);
pixmap.fill(Qt::transparent);
QPainter p(&pixmap);
//p.setCompositionMode( QPainter::CompositionMode_Source );
p.translate(-boundingRect.topLeft()*scale);
p.scale(scale,scale);
QStyleOptionGraphicsItem opt;
boostForeach(QGraphicsItem* item,items) {
item->paint(&p, &opt, 0);
}
p.end();
deleteVector(items);
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(pixmap);
item->setScale(1.0/scale);
item->setOffset(boundingRect.topLeft()*scale);
qDebug() << "Pixmap done. 1/Scale " << 1.0/scale;
return item;
}
「より大きな」アイテムでは、これは小さなアイテムでは正常に機能し、クラッシュします。状態は 1/scale のようです。結果のピックスマップ アイテムを縮小するために使用されるこの値が小さすぎる場合、関数は完了しますが、結果のアイテムのレンダリングはクラッシュします。これに加えて、すでに述べたように、物理的なサイズがたとえば 100 倍に拡大されたオブジェクトのレンダリングは、小さなオブジェクトよりもはるかに高速に見えるようです。推奨されるグラフィックの寸法に関する一般的なガイドラインはありますか?また、この効果はどこから来るのでしょうか?