In einer einfachen Form habe ich ein paar Tasten und ein horizontales Layout. Wenn die Maus den Bereich verlässt, sollte eine der Schaltflächen, die letzte, ausgeblendet werden. Mit button-> hide() funktioniert es, aber alle Buttons werden vom Layout-Manager neu angeordnet. Was ich will, ist, dass alle anderen Knöpfe in ihren Positionen weitermachen. Ich habe versucht, das Widget durch einen Widget-Platzhalter zu ersetzen und die Schaltfläche und den Platzhalter zu vertauschen()/show(), placeholder-> resize (button-> size()), aber der Layout-Manager respektiert die Größenänderung und die Platzhalter wird mit seiner Mindestgröße festgelegt. Was ist der beste Weg, um ein Widget zu entfernen und seinen Platz zu halten?Verstecken von Qt-Widget und Halten von Widget-Speicherplatz
Antwort
Ich weiß nicht, ob das der beste Weg ist, aber löste dies mit einem QStackedWidget, um den Knopf zu wickeln.
Sie können versuchen, die Schaltfläche zum Verbergen in einem anderen Widget zu verwenden und versuchen, das andere Widget seine Größe beizubehalten, wenn die Schaltfläche ausgeblendet ist. Dies könnte ein wenig schwierig sein. Ein QStackedWidget wurde vorgeschlagen, und könnte der Weg sein ... es wäre ähnlich wie der QWidget-Wrapper, außer dass das Sizing einfacher ist.
Eine andere Option, die Sie betrachten können, ist das Einfügen eines Abstandshalters für den Platzhalter und das Festlegen des Abstandshalters auf eine feste Größe, die der Größe der Schaltfläche entspricht. (Sie müssen die Größe aktualisieren, wenn sich die Größe der Schaltfläche ändert). Sie sollten in der Lage sein, diese paarweise anzuzeigen/auszublenden und es so zu gestalten, wie Sie es erwarten.
Ich würde auch versuchen, einen Ereignisfilter zu installieren, der das ursprüngliche Paint-Ereignis überschreibt, einen transparenten Hintergrund zeichnet und die meisten Ereignisse ignoriert, auf die das Widget nicht reagieren sollte (wahrscheinlich alle außer QResizeEvent
). Wenn das Widget wieder sichtbar wird, entfernen Sie den Ereignisfilter.
Siehe QObject::installEventFilter(QObject*)
und QObject::removeEventFilter(QObject*)
.
Versuchen Sie, die Schaltfläche, die Sie ausblenden und in einem anderen Layout anzeigen möchten, zu setzen. In diesem Layout zusammen mit dem Knopf setzen Sie einen Abstandhalter. Call-Button ausblenden und Spacer übernehmen. Spacer übernimmt den Platz des versteckten Buttons. Andere Tasten belegen weiterhin den gleichen Platz.
Eine einfache Möglichkeit besteht darin, die Mindestgröße des Platzhalter-Widgets festzulegen, anstatt die Größe zu ändern. Während die Größe des Widgets von Layouts nicht eingehalten wird, ist die Mindestgröße.
Ich hatte das gleiche Problem.
Ich landete schließlich einen HorizontalSpacer (mein Layout war horizontal), die ich zunächst auf 0-Größe und feste Größe Politik eingestellt. Dann habe ich verwendet:
if (button_is_shown)
ui.horizontalSpacer->changeSize(0,0, QSizePolicy::Fixed, QSizePolicy::Fixed);
else
ui.horizontalSpacer->changeSize(1,1, QSizePolicy::Expanding, QSizePolicy::Fixed);
Um den Raum zu füllen. In ähnlicher Weise könnten Sie die Größe des Abstandshalters an die Größe der Schaltfläche anpassen und sie als Fixed QSizePolicy beibehalten.
Die einfachste Möglichkeit ist es, die maximale Größe der Schaltflächen auf ihren Größenhinweis zu setzen.
Dies sollte die sichtbaren Tasten die gleiche Größe behalten und nicht zwingen, sie zu erweitern, wenn eine andere ausgeblendet wird. Sie müssen darauf achten, dass wenn Sie den Text auf den Schaltflächen ändern, dass Sie ihre maximale Größe zurücksetzen, aber Sie wahrscheinlich nur an einer Stelle sowieso tun. Ich glaube, dass so etwas in einem der ersten Kapitel des Qt-Buches gemacht wurde (aber ich habe es nicht vor mir, also kann ich dich nicht an den richtigen Ort verweisen).
Versuchen Sie, Ihre Widget in ein QStackWidget mit 2 Seiten einzubetten: * Ihr Widget (n) auf der einen Seite * eine weitere leere Seite
Set aktuellen qstackwidget Seite auf die leere Seite, wenn Sie Ihr Widget ausblenden möchten . Und setze es zurück auf deine Hauptseite, um deine Widgets anzuzeigen.
In Qt 5.2 ist es möglich, folgendes zu tun:
QSizePolicy sp_retain = widget->sizePolicy();
sp_retain.setRetainSizeWhenHidden(true);
widget->setSizePolicy(sp_retain);
ich gepostet früher die gleiche Lösung hier:
How to make a Qt widget invisible without changing the position of the other Qt widgets?
(das ist ein Duplikat dieser Frage zu sein scheint) .
- 1. Transparent QtWidget
- 2. .NET verstecken titlebar aber halten Grenze
- 3. Verstecken von Textfeld webView
- 4. Sortieren Array und halten Werte von Schlüsseln
- 5. Halten von Anwendungen und Infrastruktur verbunden
- 6. Cursor links klicken und halten von Batch
- 7. Verstecken von Lua Quellcode In C Anwendung
- 8. Verstecken von Ionen-Folien-Pagern?
- 9. PHP Verstecken Unterordner von SCANDIR
- 10. Verstecken von Nullwerten im Säulendiagramm
- 11. Verstecken von Punktansichten von MPChart LineChart
- 12. Halten von Java-Methoden von Android JNI
- 13. Halten von kostenlosen EC2-Instanzen
- 14. ListView zum Halten von LinearLayouts
- 15. Bedingte Verstecken und Einblenden von Bildordnern in Android
- 16. wie zweite und Millisekunde von jQuery UI Datetime verstecken
- 17. Problem in verstecken und zeigen von Combobox in Struts2
- 18. Einführungs-Prozess und zu verstecken Kommandozeilenparameter von Task-Manager
- 19. HTML - JavaScript - Hinzufügen und Löschen/Verstecken von Elementen
- 20. Verbinden mit db und Verstecken von Elementen mit js
- 21. DLL Schutz - Verstecken Methoden und Variablen von anderen Menschen
- 22. Wie Aktion und Steuerung von URL verstecken: asp.net Mvc
- 23. Verstecken und Zeigen Linearlayout
- 24. jQuery: verstecken und zeigen
- 25. - Fitbounds und halten Zentrum
- 26. Verstecken Paypal-Schaltfläche von Braintree Dropin Ui
- 27. JavaScript: Verstecken und Zeigen Menü Klasse
- 28. Tablesorter verstecken Filter von versteckten Spalten
- 29. Zeigen/Verstecken von Komponenten in ReactJS
- 30. Verstecken von Text mit "Text-Einzug"
Guter Vorschlag, habe ich versucht, um ähnliche Probleme zu beheben, aber ich hatte zwei Tasten und einen Fortschrittsbalken auf der Seite. Wenn der Fortschrittsbalken nicht sichtbar ist, bleiben die beiden Schaltflächen nun rechts, indem sie im Dialog zentriert werden. – zar