3

centerOn() を作成してビューポートをアイテムの周りに移動する方法がわかりません(またはポートの周りのアイテム、どちらの方向かわかりません)。

次のコードはメインで機能します。

view.setDragMode(QGraphicsView::ScrollHandDrag);
view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setFrameStyle(QFrame::NoFrame);
view.showFullScreen();

QGraphicsPixmapItem *pmItem = new QGraphicsPixmapItem(pixMap);
scene.addItem(pmItem);

view.centerOn(QPointF(50,30));
view.show();
rc = qA.exec(); 

ただし、オーバーロードされた QGraphicsView の paintEvent() から同じことをしようとすると、centerOn() は何もしません。

class MyView :: public QGraphicsView { ... }

void MyView::init(){
    ...
    setDragMode(QGraphicsView::ScrollHandDrag);
    setFrameStyle(QFrame::NoFrame);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    _scene.clear();
    setScene(&_scene);

    super::showNormal();

}


void MyView::paintEvent(QPaintEvent *aEvent){
    _scene.clear();
    QGraphicsPixmapItem *pmItem = new QGraphicsPixmapItem(pixMap);
    _scene.addItem(pmItem);
    centerOn(QPointF(50.0, 30.0));

    super::paintEvent(aEvent);
}

何が恋しいですか?ありがとうございました

アレックス

4

2 に答える 2

2

基本的には、paintEvent 呼び出しの下でじゅうたんを引っ張ります。

QGraphicsView は、シグナルとスロットを介して QGraphicsScene と通信します。実際の paintEvent は作成直後に呼び出されるため、シーンは新しいアイテムが追加されたことをビューに通知する機会がありません。2 つのステップの間にイベント ループ プロセスはありません。そのため、paintEvent 呼び出しでは、センタリングの変更は言うまでもなく、新しいアイテムに対して適切にセットアップされていません。

描画が完了すると、ビューが検証され、すべてが描画されたと見なされます。したがって、新しいアイテムの領域は決して更新されません。

描画または更新イベントの外部で centerOn を呼び出します。

于 2012-10-19T05:25:43.830 に答える
1

に高い値を設定することで、この問題を解決しましたsetSceneRect。次に、オブジェクトまたは位置にシーンを集中させます。

例:

this->ui->graphicsView->setSceneRect (0,0,100000000, 100000000);
this->ui->graphicsView->centerOn(500,1030);

setSceneRectサイズGraphicsViewが正しく動作しません。

于 2014-04-17T20:19:59.220 に答える