Haciendo QGraphicsScene más grande cuando un elemento gráfico se coloca contra su frontera

StackOverflow https://stackoverflow.com/questions/4237387

  •  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?

¿Fue útil?

Solución

Yo sugeriría hacer algo como lo siguiente:

  1. Obtener el rect de delimitación de todos los elementos de la escena utilizando QGraphicsScene::itemsBoundingRect().
  2. 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.
  3. 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top