4

Qtで(matlabからの)impolyに似た関数を作成しようとしています。現在、QGraphicsViewのサブクラスがあり、仮想関数「drawBackground」を次のように設定しています。

void roiwindow::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->drawImage(rect, *refimage);
painter->restore();
}

これはうまく機能し、基本的に背景レイヤーに関してはまさに私が望むものです。今、私は最終的にポリゴンのノードとして機能する円を追加しようとしています。私はこれを使用して行いました:

QGraphicsView *view = new QGraphicsView(this);
view->show();
QGraphicsEllipseItem *e1;
e1 = this->addEllipse(20, 20, 30, 30, QColor(0, 0, 0), Qt::white);
e1->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsMovable);

これは私が欲しいものの一種です。ただし、楕円をクリックしてドラッグすると、楕円の背景が* refimageの縮小バージョンになるという問題があります...これにより、画面全体に一種の縞が残りますが、別のウィンドウをクリックすると消えます。ウィンドウを最小化します。QGraphicsItemはdrawBackgroundも呼び出しますか?もしそうなら、それはアイテムがドラッグされているときにのみそれを呼び出すようです。これをより適切にコーディングする方法についての提案はありますか?ありがとう。

4

2 に答える 2

4

おそらく QGraphicsView がデフォルトのビューポート更新モードに設定されているため、ストリークが発生していますQGraphicsView::MinimalViewportUpdate。この場合、必要ですQGraphicsView::FullViewportUpdate。その理由は、アイテムを移動するとき、その背後の背景を再描画する必要があるためですが、MinimalViewportUpdate設定すると、アイテムのみが再描画されます (ウィンドウの最小化/最大化などによるビューポートの完全な更新がない限り)。

于 2012-05-22T20:44:40.017 に答える
2

QGraphicsView::drawBackgroundグラフィックビューの何かを再描画する必要があるときはいつでも呼び出されます。この何かは、パフォーマンスを向上させるためにビュー全体よりも小さい場合があります。

例: より大きなシーン/ビュー内に 50 x 50 ピクセルの長方形のアイテムがある場合、この長方形を右に 20 ピクセル移動すると、アイテムの前の + 新しい位置 (70 x 50 ピクセル) が再描画されます (これが変更される領域であるため)。

の再実装ではdrawBackground、次のように言います。

painter->drawImage(rect, *refimage);

ビューの合計サイズではなく、実際に更新される領域のサイズで画像を描画します。

毎回同じ位置と同じサイズで画像を描画するには、一定の位置 (原点など) を使用し、画像のサイズを変更しないでください。

painter->drawImage(0, 0, *refimage);

または、シーンの領域全体を使用できます。

painter->drawImage(sceneRect(), *refimage);

ここでsceneRect()、シーンがシーン全体で使用するのと同じ四角形として定義されます。この四角形は、四角形の外にある新しいコンテンツを追加すると自動的に更新されます。手動で値を設定することで、シーン四角形を強制することもできます。次に例を示します。

scene()->setSceneRect(0, 0, 800, 800);

ドキュメントを参照してください:QGraphicsView::sceneRectおよびQGraphicsScene::sceneRect

于 2012-05-22T20:42:08.797 に答える