Pregunta

he estado tomando el pelo con éste durante horas. Hay un hilo aquí al respecto, pero nada parece estar funcionando. QGraphicsView :: rect () devolverá el ancho y la altura, pero los valores left y top no se han establecido correctamente (siempre 0 - haciendo caso omiso de la cantidad desplazado). Quiero que en coordenadas de la escena, pero debería ser bastante fácil de traducir de cualquier sistema. No tengo idea de lo que horizontalScrollBar()->value() y vert están regresando ... parece ser jibberish sentido.


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));
}
¿Fue útil?

Solución 2

No importa. Se le ocurrió esto, que parece funcionar.

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

Otros consejos

Sólo mapear el rectángulo de visualización basado en píxeles de la escena utilizando la vista:

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

adiós, Marcel

aquí hay una solución posible (ni idea de si esta es la intención de uno)

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, Bernhard

La siguiente aplicación devolvió los mejores resultados para mí:

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

Esto funciona muy bien aún cuando aparezcan las barras de desplazamiento. Esto sólo puede funcionar correctamente si la vista no se muestra la escena gira o cortado. Si la vista se gira o cizallado, entonces el rectángulo visible no es paralela eje en la escena de un sistema de coordenadas. En este caso

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

devuelve un QPolygonF (no un QRectF), que es el rectángulo visible en escena las coordenadas. Por cierto, QPolygonF tiene una boundingRect() función miembro que no devuelve el rectángulo adecuadamente visible de la vista, pero podría ser útil de todos modos.

Usted puede hacer lo que has hecho, o utilizar las funciones mapToScene (). No se puede contar en la escena "rectángulo" que resulta ser un rectángulo, sin embargo, debido a que la escena podría ser girada o cortado en la vista, lo que resulta en un polígono general cuando se asigna a la escena.

Si la aplicación no hace este tipo de cosas, por supuesto, usted es libre de asumir que un rectángulo es siempre apropiada.

Parece que lo que quiere es la escena del rectángulo. El método ::rect() se hereda de QWidget. Ver:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top