获取QGraphicsView的可见矩形?

mpe*_*pen 12 c++ qt qgraphicsview

我一直在用这个把头发拉出来好几个小时.有一个线程在这里吧,但似乎没有奏效.QGraphicsView :: rect()将返回宽度和高度,但是未正确设置lefttop值(始终为0 - 忽略滚动量).我希望它在场景坐标中,但它应该很容易从任何系统翻译.我不知道什么horizontalScrollBar()->value()和Vert正在回归......似乎是毫无意义的胡言乱语.


@ fabrizioM:

// 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));
}
Run Code Online (Sandbox Code Playgroud)

小智 23

只需使用视图将基于像素的视口矩形映射到场景:

graphicsView->mapToScene(graphicsView->viewport()->geometry()).boundingRect()
Run Code Online (Sandbox Code Playgroud)

再见,马塞尔

  • 使用`graphicsView-> rect()`而不是`graphicsView-> viewport() - > geometry()`可能会更短. (5认同)
  • @Sharpie 如果 viewport() 周围有边框(或可见的滚动条),则它是相关的。 (2认同)

mpe*_*pen 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));
}
Run Code Online (Sandbox Code Playgroud)


Ral*_*zky 5

以下实现为我返回了最好的结果:

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 );
}
Run Code Online (Sandbox Code Playgroud)

当滚动条出现时,这仍然非常有效。仅当视图不显示旋转或剪切的场景时,此功能才能正常工作。如果视图被旋转或剪切,则可见矩形在场景坐标系中与轴不平行。在这种情况下

view->mapToScene( view->viewport()->geometry() )
Run Code Online (Sandbox Code Playgroud)

返回一个QPolygonF(不是 a QRectF),它是场景坐标中的可见矩形。顺便说一下,QPolygonF有一个成员函数boundingRect(),它不会返回视图的正确可见矩形,但无论如何可能很有用。