5

この質問は関連しています: QGraphicsItem を強制的にそのままにしておく

QGraphicsItemシーン内を移動するときは、固定された場所に配置したいと思います。

void paintEvent(QPaintEvent*)推奨される解決策は、サブクラスのをオーバーライドすることQGraphicsViewです。

void MyGraphicsView::paintEvent(QPaintEvent*) {
  QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
  myItem->setPos(scenePos);
}

ただし、問題は、シーン内の他のすべてをそのままにしておきたいということです。つまり、ズームまたは移動する場合、他のすべてQGraphicsItemsをデフォルトとして動作させたいのです。

void QGraphicsView::paintEvent(QPaintEvent*)これを解決する 1 つの貧弱な方法は、 内から呼び出すことvoid MyGraphicsView::paintEvent(QPaintEvent*)です。

void MyGraphicsView::paintEvent(QPaintEvent* event) {
  QGraphicsView::paintEvent(event);

  QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
  myItem->setPos(scenePos);
}

ただし、最初に追加されたコードを使用して配置され、次に追加されたコードを使用してmy_item配置されるため、ちらつき動作が追加されます。QGraphicsView::paintEvent(event);

QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
myItem->setPos(scenePos);

void MyGraphicsView::paintEvent(QPaintEvent*)問題は、ゼロから再実装しmyItemて、他のすべての の望ましい動作とデフォルトの動作の両方のコードを記述する必要QGraphicsItemsがあるか、またはこれを行う簡単な方法があるかということです。

ありがとうございました。

4

1 に答える 1