Cambiar el tamaño de una QGraphicsItem para ocupar todo el espacio en un QGraphicsView, problemas al cambiar el tamaño de ventana

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

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?

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top