获取QGraphicsView的可见矩形?

问题描述 投票:0回答:7

我已经用这个把头发拔了好几个小时了。有一个关于它的线程here,但似乎没有任何作用。 QGraphicsView::rect() 将返回宽度和高度,但

left
top
值未正确设置(始终为 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));
}
c++ qt qgraphicsview
7个回答
29
投票

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

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

再见, 马塞尔


9
投票

没关系。想出了这个,看起来很有效。

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));
}

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 );
}

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

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

返回一个

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


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);
}

2
投票

您可以执行您已完成的操作,或使用mapToScene() 函数。但是,您不能指望生成的场景“矩形”是矩形,因为场景可能在视图中旋转或剪切,从而在映射到场景时产生一般多边形。

如果您的应用程序从不执行此类操作,当然,您可以随意假设矩形始终合适。


0
投票

听起来你想要的是场景矩形。

::rect()
方法继承自
QWidget
。参见:

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


0
投票

@mpen 的 Qt5/Qt6 版本解决方案:

QRectF EditorView::visibleRect() {
    const QRect viewportRect(QPoint(horizontalScrollBar()->value(), verticalScrollBar()->value()), viewport()->size());
    const auto mat = transform().inverted();
    return mat.mapRect(viewportRect);
}
© www.soinside.com 2019 - 2024. All rights reserved.