ein QGraphicsItem Ändern der Größe des ganzen Raum in einem QGraphicsView aufzunehmen, Probleme, wenn das Fenster wird verkleinert

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

Frage

Ich habe eine QGraphicsItem (eigentlich ein QDeclarativeItem) und ich möchte es den gesamten sichtbaren Raum des QGraphicsView aufzunehmen (wieder, es ist eigentlich die abgeleitete QDeclarativeView Klasse), zu dem es zugegeben. Normalerweise können Sie QDeclarativeView::setResizeMode(QDeclarativeView::SizeRootObjectToView) und QDeclarativeView wird das Root-Objekt automatisch die Größe passen die Ansicht verwenden.

Das Problem, das ich habe ist, dass ich manuell die Root-Widget erschaffe mit

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

, anstatt dass QDeclarativeView es automatisch tun, indem setSource() aufrufen. Der Grund, warum ich das tue, weil ich die QML Szene tauschen will, wenn bestimmte Ereignisse auftreten, aber ich will nicht die vorherige Szene zerstören. Der Aufruf setSource() löscht alle Elemente, die hinzugefügt wurden, bevor setSource() genannt wird. Anstatt also ich das „Wurzelobjekt“ selbst zu schaffen und Hinzufügen zu der Szene manuell.

Ich verwende die Fenster resizeEvent mein QDeclarativeItem, um die Größe, wie folgt aus:

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

Dies funktioniert! Aber, es ist nicht sehr hübsch. Wenn Sie das Fenster schnell skalieren, wird die QDeclarativeItem nicht schnell genug angepasst und Sie kurz einen grauen Hintergrund sehen, bevor sie einholt und deren Größe. Es ist auch nicht sehr glatt.

Dies geschieht nur, wenn ich ein komplexes Element (in meinem Fall, es ist ein QWebKit widget) der Größe verändert werden. Es funktioniert gut für einfachere Elemente. Die Sache ist jedoch, dass, wenn ich QDeclarativeView lassen Sie es tun, ich habe keines dieser Probleme. Seine korrekt und reibungslos Größe verändert

Ich stelle mir das nicht spezifisch für die Sachen QtDeclarative ist, sondern QGraphicsView, aber vielleicht bin ich da falsch.

Hat jemand irgendwelche Ideen?

War es hilfreich?

Lösung 2

Ich habe meine Probleme gelöst.

Das Problem scheint mit QML der WebView-Element zu sein. Ich schaltete es aus für eine QGraphicsProxyWidget von C ++ registriert, mit dem Widget-Set zu einem normalen QWebView und alle Probleme verschwinden. Es verhält sich nun genau, wie ich das WebView erwartet zu verhalten.

Der Nachteil ist, dass ich die QWebView Signale / Slots / Eigenschaften QML manuell belichten. (EDIT:. Ich habe dieses Problem gelöst durch eine schreibgeschützte Eigenschaft namens object mit, die das Set-Widget liefert Da QObjects Javascript zugängliche Objekte automatisch umgewandelt werden, kann ich die Web-Ansicht zugreifen, für exmaple, wie folgt aus:. object.url = 'http://google.com' Für Bequemlichkeit, habe ich auch invoke eine Funktion init Javascript ont er QML-Objekt, wenn es vorhanden ist, so dass ich einfach die Web-Ansicht dort oben gesetzt - funktioniert gut)

Eine weitere Änderung, die ich gemacht, da ich die Frage gestellt wird, ist das „Wurzelobjekt“ Umschalten von C ++ in QML selbst, mich zu bewegen, indem ein Vollbild-Rechteck mit einer C ++ -callable JavaScript-Funktion schaffen, die verwendet Qt.createComponent () zu laden, die " Ist“QML-Datei und Anker mit anchors.fill. Auf diese Weise die Logik (und Caching von Objekten) in QML, anstelle von C gemacht ++, so kann ich einfach setSource (), lassen Sie Qt Griff Größe ändern und so, und ich arbeite rein in QML (für diesen Teil der App, sowieso).

Andere Tipps

Ich bin nicht sicher, ob dies loszuwerden, das Flimmern bekommen, aber Sie können fitInView in Ihrem resizeEvent():

declarativeView->fitInView(object, Qt::IgnoreAspectRatio);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top