2

私は誰かがウィンドウのサイズに合うようにQGraphicsView電流をスケーリングできるようにするを作成しようとしています。QGraphicsItemQGraphicsView

カスタムバージョンを作成するためにオーバーライドQGraphicsItemし、いくつかのメソッドを実装して、スケーリングされた量を認識しました(これは常に元のバージョンに比例するため、スケール係数は1つだけです。幅と高さは同じです)。

したがって、scaleFactorセッターには次のものがあります。

void ImagePixmapItem::setScaleFactor(float sf){
    scaleFactor = sf;
    this->boundingRect().setWidth(this->boundingRect().width()*scaleFactor);
    this->boundingRect().setHeight(this->boundingRect().height()*scaleFactor);

}

そして、私のメインフォームでは、ボタンに次のものがあります。

   QRect portRect = ui->graphicsView->viewport()->rect();
    double scaleFactorX;
   if(portRect.width() <= (item->boundingRect().size().width()))
       scaleFactorX =portRect.width() /(item->boundingRect().size().width());
   else
       scaleFactorX = (item->boundingRect().size().width())/portRect.width();

    qDebug("Scalefactor: %4.3f \n", scaleFactorX);
    qDebug("item width: %4.3f \n", item->boundingRect().size().width());
    qDebug("item height: %4.3f \n", item->boundingRect().size().height());
    item->setScaleFactor(scaleFactorX);
    item->scale(scaleFactorX,scaleFactorX);

itemそれらの1つはどこにありますかImagePixmapItem

これは最初はうまく機能します-私の画像はビューポートよりも大きく、ウィンドウに合うように(少なくとも幅に関して)うまく縮小されます。ただし、もう一度ボタンを押すとscaleFactorXitem幅と高さが同じ値に戻ります。

boundingRect変換後の画像を変更できますか?そうでない場合は、どうすればよいですか?

4

1 に答える 1

3

まずQGraphicsItem::boundingRect()、rectのコピーを返します。変更しても実際のアイテムには影響しません。アイテムのジオメトリを変更するには、その関数をオーバーライドして、別のrectを返す必要があります。そしてprepareGeometryChange()、実際に変更したときに電話してください。

ここで、アイテムをQGraphicsViewのビューポートに合わせるだけの場合は、を使用しますQGraphicsView::fitInView()

アイテムの変換を変更することは、シーンからビューへの変換を変更することとは大きく異なります。前者は、他のアイテムとの関係でアイテムがシーンに配置される方法を変更します。後者は関係を維持し、シーンがビューに「反映」される方法にのみ影響します。

シーンにアイテムが1つしかない場合は、それほど違いはありません。より複雑なシーンを扱っている場合は、アイテムの変換が世界の数学モデルを扱い、それをどのように表示するかではないことを覚えておいてください。

編集:

コードを読み直しました。スケールファクターの計算が間違っていることがわかりました。テストされていない基本的なコードは次のとおりです。

QRect itemSize = graphicsView->mapFromScene(item->sceneBoundingRect()).boundingRect().size();
QRect scaledSize =itemSize.scale(graphicsView->viewport().size(), Qt::KeepAspectRatio);
double ratio = qMin((double)scaledSize.width()/itemSize().width(), (double)scaledSize.height()/itemSize().height());
item->setTransform(QTransform::fromScale(ratio,ratio), true);

ポイントは、アイテムの変換に関係なく常に同じであるアイテムのローカル境界であるため、sceneBoundingRect代わりに使用することです。そして、sceneBoundingRectは、すべてが適用された後の境界です。boundingRectboundingRecttransformations

于 2011-04-12T17:39:17.367 に答える