Cambiar el tamaño de una QGraphicsItem para ocupar todo el espacio en un QGraphicsView, problemas al cambiar el tamaño de ventana
-
25-09-2019 - |
Pregunta
Tengo un QGraphicsItem
(en realidad, una QDeclarativeItem
) y yo quiero que ocupan todo el espacio visible de la QGraphicsView
(de nuevo, es en realidad la clase QDeclarativeView
derivado) a la que se añadió. Normalmente, se puede utilizar QDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView)
y QDeclarativeView
va a cambiar automáticamente el tamaño del objeto raíz para adaptarse a la vista.
El problema que estoy teniendo es que estoy creando manualmente widget de la raíz utilizando
QDeclarativeComponent component(declarativeView->engine(), QUrl(qml));
QDeclarativeItem* object = qobject_cast<QDeclarativeItem*>(component.create());
if (object)
{
declarativeView->scene()->addItem(object);
...
en lugar de dejar que lo haga automáticamente QDeclarativeView
llamando setSource()
. La razón por la que estoy haciendo esto es porque quiero cambiar la escena QML cuando ocurren ciertos eventos, pero no quiero destruir la escena anterior. Llamando setSource()
elimina todos los elementos que se agregaron antes setSource()
se llama. Así, en lugar que estoy creando el "objeto raíz" a mí mismo y agregarlo a la escena manualmente.
Estoy utilizando las ventanas resizeEvent para cambiar el tamaño de mi QDeclarativeItem
, como esto:
void AppWindow::resizeEvent (QResizeEvent* event)
{
QDeclarativeItem* object = sceneCache.value(sceneName, 0);
if (object)
{
object->setWidth(declarativeView->viewport()->width());
object->setHeight(declarativeView->viewport()->height());
}
}
Esto funciona! Sin embargo, no es muy bonita. Si cambia el tamaño de la ventana rápidamente, el QDeclarativeItem
no cambia de tamaño con la suficiente rapidez y se ve brevemente un fondo gris antes de que se pone al día y cambia el tamaño de la misma. Su también no muy suave.
Esto sólo ocurre si tengo un tema complejo está cambiando el tamaño (en mi caso, es un widget de QWebKit). Funciona bien para los artículos más simples. La cosa es, sin embargo, que si dejo que QDeclarativeView
hacerlo, no tengo ninguno de estos problemas:. Redimensionado su forma correcta y sin problemas
Me imagino que esto no es específico de la materia QtDeclarative, sino más bien QGraphicsView, aunque tal vez me equivoque allí.
¿Alguien tiene alguna idea?
Solución 2
he resuelto mis problemas.
El problema parece ser con el elemento WebView de QML. Cambié a cabo por un QGraphicsProxyWidget registrada de C ++, con el conjunto de widgets a una QWebView normal y todos los problemas desaparecen. Ahora se comporta exactamente como me esperaba que la vista Web comportarse.
La desventaja es que necesito para exponer manualmente los QWebView señales / ranuras / propiedades a QML. (EDIT:. He resuelto esto por tener una propiedad de sólo lectura denominado object
, que devuelve el conjunto de widgets Desde QObjects se automagicamente convierten en objetos accesibles javascript, puedo acceder a la vista web, por ejemplo, los grupos así:. Para object.url = 'http://google.com'
conveniencia, también invocar una función init Javascript ont él objeto QML, si es que existe, por lo que simplemente puse la vista web hasta allí - funciona muy bien)
Otro cambio que hice desde que la pregunta es mover el "objeto raíz" se cambia de C ++ en sí mismo QML, mediante la creación de una pantalla completa rectángulo con una función de JavaScript C ++ -callable que utiliza Qt.createComponent () para cargar el " "archivo QML real y el ancla con anchors.fill. De esta manera la lógica (y el almacenamiento en caché de objetos) se realiza en QML, en lugar de C ++, por lo que puedo simplemente setSource (), y mucho mango Qt cambiar el tamaño y tal y trabajo puramente en QML (para esta parte de la aplicación, de todos modos).
Otros consejos
No estoy seguro de si esto va a deshacerse del parpadeo, pero se puede utilizar fitInView
en su resizeEvent()
:
declarativeView->fitInView(object, Qt::IgnoreAspectRatio);