Получить видимый прямоугольник QGraphicsView?

Я уже несколько часов выдергиваю этим волосы. Там нить здесь об этом, но ничего не работает. QGraphicsView:: rect () вернет ширину и высоту, но left и top значения установлены неправильно (всегда 0 -- игнорирование прокрученной суммы). Я хочу, чтобы это было в координатах сцены, но это должно быть достаточно легко перевести из любой системы. Понятия не имею, что!--3--> и Верт возвращаются...кажется бессмысленным. вздор.


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

6 ответов


просто сопоставьте пиксельный прямоугольник видового экрана со сценой, используя вид:

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

пока, Марсель!--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));
}

вот возможное решение (не знаю, это тот)

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, Бернард!--2-->


следующая реализация вернула лучшие результаты для меня:

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

это работает по-прежнему очень хорошо, когда появляются полосы прокрутки. Это работает только правильно, если вид не отображает сцену повернутой или срезанной. Если вид повернут или срезан, то видимый прямоугольник не является осью, параллельной в системе координат сцены. В этом случае

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

возвращает QPolygonF (а не QRectF), который является видимым прямоугольником в координатах сцены. Кстати, QPolygonF имеет функцию-член boundingRect() который не возвращает правильный видимый прямоугольник представления, но может быть полезен в любом случае.


вы можете сделать то, что вы сделали, или использовать функции mapToScene (). Однако вы не можете рассчитывать на то, что результирующая сцена "прямоугольник" будет прямоугольником, потому что сцена может быть повернута или срезана в представлении, что приведет к общему полигону при сопоставлении со сценой.

Если ваше приложение никогда не делает таких вещей, конечно, вы можете предположить, что прямоугольник всегда подходит.


похоже, что вы хотите прямоугольник сцены. The ::rect() метод наследуется от QWidget. См.:

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