17

私はこれで何時間も髪を引っ張っています。ここにスレッドがありますが、何も機能していないようです。QGraphicsView::rect() は幅と高さを返しますが、値lefttop値が正しく設定されていません (常に 0 -- スクロール量を無視します)。シーン座標でそれが欲しいのですが、どのシステムからでも簡単に変換できるはずです。何とhorizontalScrollBar()->value()vert が戻ってきたのかわかりません...意味のないおしゃべりのようです。


@ファブリツィオ:

// created here
void EditorWindow::createScene() {
    m_scene = new EditorScene(this);
    m_view = new EditorView(m_scene);
    setCentralWidget(m_view);
    connect(m_scene, SIGNAL(mousePosChanged(QPointF)), this, SLOT(mousePosChanged(QPointF)));
}

/// with this constructor
EditorView::EditorView(QGraphicsScene* scene, QWidget* parent) : QGraphicsView(scene, parent) {
    setRenderHint(QPainter::Antialiasing);
    setCacheMode(QGraphicsView::CacheBackground);
    setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
    setDragMode(QGraphicsView::NoDrag);
    scale(1.0, -1.0); // flip coordinate system so that y increases upwards
    fitInView(-5, -5, 10, 10, Qt::KeepAspectRatio);
    setInteractive(true);
    setBackgroundBrush(QBrush(QColor(232,232,232), Qt::DiagCrossPattern));
}
4

6 に答える 6

29

ビューを使用して、ピクセルベースのビューポート長方形をシーンにマップするだけです。

graphicsView->mapToScene(graphicsView->viewport()->geometry()).boundingRect()

さようなら、マルセル

于 2011-01-23T18:46:36.393 に答える
7

どうでも。これを思いつきましたが、うまくいくようです。

QRectF EditorView::visibleRect() {
    QPointF tl(horizontalScrollBar()->value(), verticalScrollBar()->value());
    QPointF br = tl + viewport()->rect().bottomRight();
    QMatrix mat = matrix().inverted();
    return mat.mapRect(QRectF(tl,br));
}
于 2009-08-31T05:30:22.730 に答える
4

次の実装は私にとって最良の結果を返しました:

QRectF getVisibleRect( QGraphicsView * view )
{
    QPointF A = view->mapToScene( QPoint(0, 0) ); 
    QPointF B = view->mapToScene( QPoint( 
        view->viewport()->width(), 
        view->viewport()->height() ));
    return QRectF( A, B );
}

これは、スクロールバーが表示されている場合でも非常にうまく機能します。これは、ビューに回転またはせん断されたシーンが表示されない場合にのみ正しく機能します。ビューが回転またはせん断されている場合、表示されている長方形はシーン座標系で平行な軸ではありません。この場合

view->mapToScene( view->viewport()->geometry() )

シーン座標で表示される長方形であるQPolygonF(ではなく)を返します。QRectFちなみに、ビューの適切に表示された長方形を返さないQPolygonFメンバー関数がありますが、とにかく役立つ可能性があります。boundingRect()

于 2012-06-01T11:40:56.747 に答える
3

ここに可能な解決策があります(これが意図されたものであるかどうかの手がかりはありません)

QRectF XXX::getCurrrentlyVisibleRegion() const
{
        //to receive the currently visible area, map the widgets bounds to the scene

        QPointF topLeft = mapToScene (0, 0);
        QPointF bottomRight = mapToScene (this->width(), this->height());

        return QRectF (topLeft, bottomRight);
}

HTH、ベルンハルト

于 2010-07-29T09:28:41.410 に答える
2

行ったことを実行するか、mapToScene() 関数を使用できます。ただし、結果のシーンの「四角形」が四角形であるとは期待できません。これは、シーンがビュー内で回転またはせん断され、シーンにマップされたときに一般的な多角形になる可能性があるためです。

もちろん、アプリケーションがそのようなことをまったく行わない場合は、四角形が常に適切であると自由に想定できます。

于 2009-09-29T10:35:32.927 に答える
0

あなたが望むのはシーンの長方形のようです。メソッドは::rect()から継承されQWidgetます。見る:

http://doc.qt.io/qt-5/qgraphicsview.html#sceneRect-prop

于 2009-09-06T09:02:09.037 に答える