2009-06-30 7 views
2

Gibt es in Gtk + eine Möglichkeit, ein Widget übereinander zu stapeln - GtkFixed nicht mitgerechnet? GtkFixed funktioniert nicht gut aus zwei Gründen: 1) Ich brauche Z-Reihenfolge, und 2) Ich brauche ein Widget zum Dehnen und Füllen vorgesehenen Raum.Widgets in Gtk stapeln +

+0

Sie wollen einfach nur einmal, Füllraum, oder etwas komplexeres Widget in bestimmten Ort angezeigt werden? – liori

+0

Ich möchte ein Widget anzeigen, das den gesamten Raum ausfüllt, und dann ein weiteres oben an einem festen Ort, beide gleichzeitig sichtbar. – c4757p

+0

Heutzutage gibt es genau ein Widget, das die Kontrolle der Z-Reihenfolge und -Ausrichtung ermöglicht: ['GtkOverlay'] (https://developer.gnome.org/gtk3/stable/GtkOverlay.html). –

Antwort

1

Ich glaube nicht, dass es in Standard-GTK einen richtigen Container gibt. Ich würde Gtk :: Fixed ableiten. Es ist immer noch der nächste, den Sie bekommen können, und wenn Sie gtkmm verwenden, dann sollte Unterklassen nicht sehr schwierig sein¹. Dann können Sie die Abmessungen aller Widgets steuern, indem Sie ein ausgewähltes untergeordnetes Element auf den Raum ausdehnen.

Um die Z-Achse zu steuern, müssen Sie wahrscheinlich die X-Fenster des Widgets manipulieren - prüfen Sie die GDK-Dokumentation zum Thema GDK-Fenster². Ich erinnere mich, dass jedes Widget in PyGTK gtk.Widget.window -Eigenschaft hat, denke ich, dass das gleiche für gtkmm ist. Dies setzt voraus, dass alle Ihre untergeordneten Widgets X-Fenster haben, also z. Sie müssen Gtk :: Label in Gtk :: EventBox einfügen.

¹ http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/chapter-customwidgets.html

² http://www.gtkmm.org/docs/gtkmm-2.4/docs/reference/html/classGdk_1_1Window.html#6eef65b862344ad01b01e527f2c39741

+0

Danke. Ich hatte gehofft, dass dies von Gtk + zur Verfügung gestellt würde. – c4757p

3

ich genau dieses Problem hatte eine GTK :: Feste (eigentlich gtk.Fixed - pygtk - aber ich denke, es ist alles das gleiche unten), und ich war in der Lage um es recht einfach zu handhaben, indem man das Fenster jedes Widgets manipuliert.

In meinem Fall sind die Widgets bereits EventBox-Instanzen, und ich musste nur sicherstellen, dass die, die ich schleppte, oben war, weil sie sonst unter andere glitt, was ziemlich falsch aussah. Die Lösung war so einfach wie das Aufrufen von "widget.window.raise_()", um das zugrunde liegende Fenster des Widgets aufzurufen, wenn auf das Widget geklickt wurde, um mit dem Ziehen zu beginnen.

Also bestätige ich im Grunde nur, dass die vorherige Antwort funktioniert, aber ich wollte darauf hinweisen, dass es eigentlich ziemlich einfach ist. Es sieht so aus, als müssten Sie EventBoxen für Ihre Widgets erstellen, aber danach sollte es einfach funktionieren.

können Sie den Code sehe ich bei http://github.com/divegeek/BlockHead arbeiten an

+0

Danke! Ich werde es mir ansehen. – c4757p

+0

Ist dieser Beispielcode noch irgendwo verfügbar? Danke! – jedierikb

+0

Es ist. http://github.com/jjposner/BlockHead – divegeek