15

Qtのドキュメントによると、「ジオメトリ変更のためにアイテムを準備します。アイテムの境界を変更する前にこの関数を呼び出して、QGraphicsSceneのインデックスを最新の状態に保ちます。prepareGeometryChange()は、必要に応じてupdate()を呼び出します。」

私が理解していないのは、QGraphicsItemが境界の四角形がいつ変更されたかをどのように認識し、update()をいつ呼び出すかをどのように認識しているかです。prepareGeometryChange()を呼び出してから境界矩形を変更した後、自分でupdate()を呼び出すことになったことはありますか?

千里眼の方法のように見えるものについての洞察を大いに感謝します。

4

1 に答える 1

20
  • QGraphicsItemは、境界の四角形がいつ変更されたかをどのように認識しますか?

私はあなたが知っていると思います。複数の子アイテムを集約するQGraphicsItemGroupがあり、一度に1つの子のみを表示するとします。グループアイテムの境界長方形は、現在選択されているアイテムの境界長方形と同じである必要があります。

QRectF MyItemGroup::boundingRect() const
{
    QRectF rect;
    if (currentItem_) {
        rect = currentItem_->boundingRect();
    }
    return rect;
}

表示する必要のある子の1つを変更する方法があるとします。

void MyItemGroup::setCurrentItem(MyItem * item)
{
    if (list_of_items_.contains(item)) {
        prepareGeometryChange();
        currentItem_ = item;
    }
}

prepareGeometryChangeをコメントアウトすると、ビューはMyItemGroupの境界rectを再度要求せず、アイテムの更新(別の場所でトリガーされる)には間違ったrectが含まれます。

  • update()をいつ呼び出すかをどのように知るのですか?

QGraphicsItemのソースによると、prepareGeometryメソッド内でupdateが呼び出されるのは次の2つの場合のみです。

  1. 誰かがchanged信号に接続されている場合
  2. シーンにビューがない場合

詳細はこちら

  • prepareGeometryChange()を呼び出してから境界矩形を変更した後、自分でupdate()を呼び出すことになったことはありますか?

答えはノーだと思います。の呼び出しとは別に、シーン上のアイテム領域をダーティとしてマークし、領域自体の再描画を引き起こしますupdateprepareGeometryChange私の経験では、これは100%のケースで十分だったので、update()を呼び出す必要はありませんでした。

于 2012-03-23T09:06:34.907 に答える