2009-12-09 10 views
13

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

-1

Ich weiß nicht, ob das der beste Weg ist, aber löste dies mit einem QStackedWidget, um den Knopf zu wickeln.

0

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.

0

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*).

0

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.

0

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.

2

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.

0

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).

+0

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

6

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.

Verwandte Themen