Haciendo QGraphicsScene más grande cuando un elemento gráfico se coloca contra su frontera
-
26-09-2019 - |
Pregunta
He hecho un QGraphicsScene
con un mouseClickEvent
que permite al usuario crear cuadrados azules en el interior de la misma. Pero quiero hacer crecer la escena en la que un elemento se coloca contra su frontera para que el usuario nunca se queda sin espacio en la escena gráfica.
¿Cuál es la mejor manera de hacer una escena de gráficos más importante en este caso?
Solución
Yo sugeriría hacer algo como lo siguiente:
- Obtener el rect de delimitación de todos los elementos de la escena utilizando
QGraphicsScene::itemsBoundingRect()
. - Añadir algo de relleno alrededor de ese rect para asegurarse de que los límites de los artículos no llegarán al borde de la vista. Algo así como
myRect.adjust(-20, -20, 20, 20)
debería ser suficiente. - Uso
QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio)
para asegurar el área tomada es dentro de los límites visibles de la vista.
Eso debería hacerlo. Este código debe ser llamado cada vez que algo ha cambiado en la escena. Puede utilizar la función QRectF :: intersecciones () para averiguar si el nuevo rect se ha colocado en el borde de la vista.
¿Cuál es la mejor manera de hacer una escena de gráficos más importante en este caso?
El GraphicsScene es un sistema infinito de coordenadas. La mayoría de los clientes utilizarán itemsBoundingRect()
para tener una idea de cuánto espacio se utiliza realmente por los elementos de la escena. Si ha borrado la escena, es posible que desee llamar a QGraphicsScene::setSceneRect(QRectF())
"hacerlo más pequeño" de nuevo.
Espero que ayude.
Otros consejos
Lo siento si esto es un poco tarde (6 años), pero voy a dar una respuesta si alguien todavía está luchando con esto o quiere otro approach.I implementar esto en mouseReleaseEvent
en la deriva de la clase personalizada QGraphicsObject
. Tenga en cuenta que inicializar el tamaño de mi QGraphicsScene
(1000,1000) con la siguiente code.scene->setSceneRect(0,0,1000,1000)
. Así que aquí lo que mi código va a hacer. Si el artículo (el artículo es arrastrable) colocado junto al borde, esa frontera se incrementará. Así que aquí es mi código:
void MyItem::mouseReleaseEvent(QgraphicsceneMouseEvent* event){
QRectF tempRect = this->scene()->sceneRect();
if(this->scenePos().y() < this->scene()->sceneRect().top()){
tempRect.adjust(0,-200,0,0);
if(this->scenePos().x() < this->scene()->sceneRect().left()){
tempRect.adjust(-200,0,0,0);
}
else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
tempRect.adjust(0,0,200,0);
}
}
else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
tempRect.adjust(0,0,0,200);
if(this->scenePos().x() < this->scene()->sceneRect().left()){
tempRect.adjust(-200,0,0,0);
}
else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
tempRect.adjust(0,0,200,0);
}
}
else if(this->scenePos().x() < this->scene()->sceneRect().left()){
tempRect.adjust(-200,0,0,0);
if(this->scenePos().y() < this->scene()->sceneRect().top()){
tempRect.adjust(0,-200,0,0);
}
else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
tempRect.adjust(0,0,0,200);
}
}
else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
tempRect.adjust(0,0,200,0);
if(this->scenePos().y() < this->scene()->sceneRect().top()){
tempRect.adjust(0,-200,0,0);
}
else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
tempRect.adjust(0,0,0,200);
}
}
this->scene()->setSceneRect(tempRect);