1

QGraphicssceneの背景として色付きのタイルを描画し、QGraphicsViewを使用してシーンにパンおよびズーム機能を提供したいと思います。まず、QGraphicItemsを使用して各タイルを描画しました。私は多くのタイルを持っているので、これはパンまたはズーム時にかなりのパフォーマンスの問題でしたが、後でタイルのどの部分も変更する必要がないので、次のコードを使用してQPixmapの生成に切り替えました。

void plotGrid(){
    Plotable::GraphicItems items;
    append(items,mParticleFilter.createGridGraphics());
    append(items,mParticleFilter.getRoi().mRectangle.createGraphics(greenPen()));
    scaleItems(items,1.0,-1.0);
    QGraphicsScene scene;
    showItemsOnScene(items,&scene);
    QRectF boundingRect = scene.itemsBoundingRect();
    double cScale = ceil(1920.0/boundingRect.size().width());
    QSize size(boundingRect.size().toSize()*cScale);
    QPixmap pixmap(size);
    pixmap.fill(Qt::transparent);
    QPainter p(&pixmap);
    //p.setRenderHint(QPainter::Antialiasing);
    scene.render(&p);
    p.end();
    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(pixmap);
    item->setOffset(boundingRect.topLeft()*cScale);
    item->scale(1/cScale,1/cScale);
    mpView->showOnScene(item);
  }

これでズームとパンの問題は解決しますが、ピックスマップを生成する時間は、おそらく最初にシーンを作成してからレンダリングするため、かなりの遅延が発生します。QGraphicItemsから開始してその場でQPixmapを作成するより速い方法はありますか?

完全を期すために、タイルの画像:ここに画像の説明を入力してください

4

1 に答える 1

0

だから私はついに中間シーンを使って少なくとも過去を乗り越えました。次のコードは、ピックスマップのレンダリングにQPainterのみに依存しています。私の主な問題は、すべての変換を正しく行うことでした。それ以外の場合は非常に簡単です。このバージョンでは、私のシナリオでは処理時間が500ミリ秒に半分になります。アイテムのペイントに450msが費やされます。誰かがより多くの改善のためのより多くの提案を持っているならば、それは大歓迎です(ちなみに解決策を変えることはあまり役に立ちません)

void SceneWidget::showAsPixmap(Plotable::GraphicItems const& items){
    QRectF boundingRect;
    boostForeach(QGraphicsItem* pItem,items) {
      boundingRect = boundingRect.united(pItem->boundingRect());
    }
    QSize size(boundingRect.size().toSize());
    double const cMaxRes =1920;
    double const scale = cMaxRes/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();
    QGraphicsPixmapItem* item = new QGraphicsPixmapItem(pixmap);
    item->scale(1.0/scale,-1.0/scale);
    item->setOffset(boundingRect.topLeft()*scale);
    showOnScene(item);
}
于 2012-11-18T14:50:26.560 に答える