获取的QGraphicsView的可见矩形?(Get visible rectangle of QG

2019-07-04 02:31发布

我一直在拉我的头发与这一个小时。 有一个线程在这里吧,但似乎没有奏效。 的QGraphicsView ::矩形()返回的宽度和高度,但lefttop的值设置不正确(始终为0 -忽略了滚动量)。 我想在现场坐标,但它应该是很容易从任何系统翻译。 我不知道horizontalScrollBar()->value()和VERT正在返回...似乎是毫无意义的jibberish。


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

Answer 1:

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

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

再见,马塞尔



Answer 2:

没关系。 想出了这一点,这似乎工作。

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


Answer 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,伯恩哈德



Answer 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()不返回视图的正确可见矩形,但可能是有用的反正。



Answer 5:

你可以做你做了什么,或使用mapToScene()函数。 你不能指望结果场景“矩形”是一个矩形,但是,由于现场可能被转动或视图中的剪切,导致一般的多边形当映射到现场。

如果您的应用程序从来不做这样的事情,当然,你可以自由地假设一个矩形总是合适的。



Answer 6:

这听起来像你想要的是现场的矩形。 的::rect()方法是继承自QWidget 。 看到:

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



文章来源: Get visible rectangle of QGraphicsView?