Qt: Wie Sie Kraft einer verborgenen widget für die Berechnung der layout?
Was ich versuche zu tun, ist machen ein qwidget in ein anderes Fenster (manuell mit einem QPainter)
Habe ich ein QWidget (w) mit einem layout und einer Reihe von untergeordneten Steuerelementen. w versteckt ist. Bis w angezeigt wird, gibt es keine layout-Berechnungen geschieht, was erwartet wird.
Wenn ich rufe w->render(painter, w->mapToGlobal(QPoint(0,0))
bekomme ich eine Reihe von Steuerelementen, alle sich gegenseitig überlappen.
w->layout()->activate();w->layout()->update()
scheint nicht, etwas zu tun.
Gibt es eine Möglichkeit zu zwingen, das layout zu passieren, ohne dass w?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zwingen, eine layout-Berechnung auf ein widget, ohne dass es auf den Bildschirm:
Den
show()
rufen Sie zwingen wird, die layout-Berechnung, undQt::WA_DontShowOnScreen
sorgt dafür, dass das widget ist nicht explizit gezeigt.show()
könnte das problem nicht lösen hier. Siehe unten meine Antwort für einen anderen Ansatz, die sollte immer funktionieren.Die layout-Berechnung eines widget kann dazu gezwungen werden, durch aufrufen von
invalidate()
gefolgt vonactivate()
auf das layout, auch wenn das widget ausgeblendet. Dies bewirkt auch, dass die widget -size()
undsizeHint()
Funktionen für die Rückgabe von korrekt und aktuell sind Werte, auch wennshow()
wurde noch nicht genannt auf das widget.Ist es jedoch notwendig, Versorgung über alle Kind-widgets und layouts an, die rekursiv, wie ein layout Neuberechnung Anfrage nicht automatisch übertragen, um die childs.
Der folgende code zeigt, wie dies zu tun.
layout->invalidate(); layout->activate();
arbeitete für mich für eine etwas andere Anwendung: erzwingen Sie die Größe eines bereits sichtbaren layout nach dem hinzufügen/entfernen eines widgets.Versuchen mit der
QWidget::sizeHint()
Methode, die zurückgeben sollte, die Größe des widget einmal gelegt.Wenn man durch
QWidget::grab()
bemerkte ich dieses Teil:QWidget::grab()
wurde in Qt 5.0, und dieser test Funktion mit einem QDialog mit einem layout scheint zu funktionieren, die auf Qt 5.5.1Dieser arbeitete für mich, wenn mit den sizeHint() plus die übersetzung der Maler, aber ich Tue dies in der paint () - Methode.
In diesem Fall
option.rect.topLeft()
gibt mir die richtige Platzierung. Sie sollten versuchen, ein sinnvoller koordinieren stattw->mapToGlobal(QPoint(0,0)
.Hatte ich einigen Erfolg in der ein ähnliches problem durch den ersten Aufruf
w->layout()->update()
vorw->layout()->activate()
. Das scheint Kraft die activate () - um wirklich etwas zu tun, anstatt denke, es ist gut, weil die Fenster nicht gezeigt wird, sowieso.