Redimensionnement un QGraphicsItem de prendre tout l'espace dans un QGraphicsView, des problèmes lorsque la fenêtre est redimensionnée

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

Question

J'ai un QGraphicsItem (en fait, un QDeclarativeItem) et je veux prendre jusqu'à laquelle il a été ajouté tout l'espace visible de l'QGraphicsView (encore une fois, est en fait la classe QDeclarativeView dérivée). Normalement, vous pouvez utiliser QDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView) et QDeclarativeView redimensionnera automatiquement l'objet racine pour adapter la vue.

Le problème que je vais avoir est que je suis en train de créer manuellement le widget racine à l'aide

QDeclarativeComponent component(declarativeView->engine(), QUrl(qml));
QDeclarativeItem* object = qobject_cast<QDeclarativeItem*>(component.create());
if (object)
{
    declarativeView->scene()->addItem(object);
    ...

au lieu de laisser QDeclarativeView le faire automatiquement en appelant setSource(). La raison pour laquelle je fais cela est parce que je veux échanger la scène QML lorsque certains événements se produisent, mais je ne veux pas détruire la scène précédente. L'appel setSource() supprime tous les éléments qui ont été ajoutés avant setSource() est appelé. Ainsi, au lieu que je crée le « objet racine » moi-même et l'ajouter à la scène manuellement.

J'utilise les fenêtres resizeEvent pour redimensionner mes QDeclarativeItem, comme ceci:

void AppWindow::resizeEvent (QResizeEvent* event)
{
    QDeclarativeItem* object = sceneCache.value(sceneName, 0);
    if (object)
    {
        object->setWidth(declarativeView->viewport()->width());
        object->setHeight(declarativeView->viewport()->height());
    }
}

Cela ne fonctionne! Mais, ce ne est pas très jolie. Si vous redimensionnez la fenêtre rapidement, le QDeclarativeItem est pas redimensionnée assez rapidement et vous voir brièvement un fond gris avant qu'il rattrape et redimensionnée. Son pas très lisse.

Cela ne se passe si j'ai un élément complexe redimensionnée (dans mon cas, est un widget QWebKit). Il fonctionne très bien pour les articles plus simples. La chose est, cependant, que si je laisse QDeclarativeView le faire, je aucun de ces problèmes. Redimensionnées correctement son et en douceur

J'imagine que ce n'est pas spécifique à la substance QtDeclarative, mais plutôt QGraphicsView, mais peut-être que je me trompe là.

Quelqu'un at-il des idées?

Était-ce utile?

La solution 2

J'ai résolu mes problèmes.

Le problème semble être avec l'élément WebView de QML. J'alluma pour un QGraphicsProxyWidget enregistré de C ++, avec le widget mis à un QWebView normal et tous les problèmes disparaissent. Il se comporte maintenant exactement comment je pensais WebView se comporter.

L'inconvénient est que je besoin d'exposer manuellement les signaux QWebView / fentes / propriétés à QML. (EDIT: J'ai résolu ce problème en ayant une propriété appelée en lecture seule object, qui retourne le widget jeu Depuis QObjects sont automatiquement converties en objets JavaScript accessibles, je peux accéder à la vue Web, pour exmaple, comme ceci:.. object.url = 'http://google.com' Pour commodité, je également appeler une initialisation fonction javascript objet QML en Ontario, il, si elle existe, donc je simplement définir la vue web là - fonctionne très bien)

Un autre changement je fait depuis avoir posé la question est de déplacer l'objet « racine » de commutation à partir de C ++ en QML lui-même, en créant un rectangle plein écran avec un C ++ -callable fonction JavaScript qui utilise pour charger Qt.createComponent () du " réel » fichier QML et l'ancre avec anchors.fill. De cette façon, la logique (et la mise en cache d'objets) est fait en QML, au lieu de C ++, donc je peux simplement setSource (), laissez Qt gérer le redimensionnement et tel et je travaille uniquement en QML (pour cette partie de l'application, de toute façon).

Autres conseils

Je ne sais pas si cela va se débarrasser de la vacillante, mais vous pouvez utiliser fitInView dans votre resizeEvent():

declarativeView->fitInView(object, Qt::IgnoreAspectRatio);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top