2009-08-31 11 views
8

He estado tirando de mi cabello con este durante horas. Hay un hilo here al respecto, pero nada parece estar funcionando. QGraphicsView :: rect() devolverá el ancho y el alto, pero los valores left y top no están configurados correctamente (siempre 0 - ignorando la cantidad desplazada). Lo quiero en coordenadas de escena, pero debería ser lo suficientemente fácil de traducir desde cualquier sistema. No tengo idea de qué horizontalScrollBar()->value() y vert están volviendo ... parece ser un jibberish sin sentido.¿Obtiene el rectángulo visible de QGraphicsView?


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

Scratch that ... los valores de la barra de desplazamiento son relativos a ... bueno, no puede ser el sceneRect() porque esos son flotantes ... pero algo similar. – mpen

+0

Tal vez es la forma de construir QGraphicsView, cualquier fragmento de código fuente? – fabrizioM

+0

No estoy seguro de qué código quiere exactamente. Realmente no importa cómo lo construyo ... obtener el rect visible debería ser exactamente el mismo. – mpen

Respuesta

3

importa. Terminó con 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)); 
} 
+1

Sin embargo, tu respuesta me ayudó mucho. ¡Gracias! – Eike

1

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

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

+0

¿Has leído la descripción? "El rectángulo de la escena define la extensión de la escena, y en el caso de la vista, esto significa el área de la escena que puede navegar usando las barras de desplazamiento". sceneRect devuelve la escena * completa *, no solo el área actualmente visible (una subsección de la escena). – mpen

+0

Levantado directamente de los documentos; "Esta propiedad contiene el área de la escena visualizada por esta vista". Esto es lo que quieres ¿no? También puede usar mapTo y mapFrom para convertir entre sistemas de coordenadas. –

+0

Los documentos no están claros. ¿Qué significa "visualizado"? ¿Significa el área de la escena con la que estás trabajando o lo que se dibuja ahora? Si tiene una gran escena en la que puede desplazarse, esta elección de palabras es ambigua. Yo también estaba confundido. parece que esta es toda la escena, no solo el área que puedes ver dibujada en la vista en este momento. – Rafe

2

Usted puede hacer lo que has hecho, o utilizar las funciones mapToScene(). Sin embargo, no puede contar con que la escena resultante "rectángulo" sea un rectángulo, porque la escena puede rotarse o cortarse en la vista, lo que da como resultado un polígono general cuando se mapea a la escena.

Si su aplicación nunca hace tales cosas, por supuesto, puede suponer que un rectángulo siempre es apropiado.

+0

Mapa * ¿qué * a la escena sin embargo? Parece que no puedo obtener la información que necesito de nada más que las barras de desplazamiento. – mpen

3

aquí es 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

+0

En Qt 4.7.4 la mayoría de las respuestas aquí no funcionan. Las coordenadas de vista (0, 0) no parecen estar siempre en la parte superior izquierda del área visible. En cambio, el sistema de coordenadas de vista se mueve por las barras de desplazamiento. Sin embargo, el método de Mark funciona. (para mí) – Eike

16

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

+4

Puede ser más corto para usar 'graphicsView-> rect()' en lugar de 'graphicsView-> viewport() -> geometry()'. – Sharpie

3

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

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

Esto funciona muy bien todavía, cuando aparecen las barras de desplazamiento. Esto solo funciona correctamente si la vista no muestra la escena girada o esquilada. Si la vista se gira o se corta, entonces el rectángulo visible no es paralelo al eje en el sistema de coordenadas de la escena. 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 función de miembro boundingRect() que no devuelve el rectángulo visible apropiado de la vista, pero podría ser útil de todos modos.

+0

¡Hay muchos errores en la muestra de código que proporcionó! – ForeverLearning

Cuestiones relacionadas