2009-06-30 6 views
2

Existe-t-il un moyen de Gtk + pour empiler un widget au-dessus d'un autre - sans compter GtkFixed? GtkFixed ne fonctionne pas bien pour deux raisons: 1) J'ai besoin de l'ordre Z, et 2) J'ai besoin d'un widget pour étirer et remplir l'espace fourni.Empiler des widgets dans Gtk +

+0

Vous voulez juste afficher un widget dans un endroit donné à temps, l'espace de remplissage, ou quelque chose de plus complexe? – liori

+0

Je souhaite afficher un widget remplissant tout l'espace, puis un autre sur un emplacement fixe, tous deux visibles en même temps. – c4757p

+0

De nos jours, oui, il y a précisément un widget qui permet le contrôle de l'ordre-Z et de l'alignement: ['GtkOverlay'] (https://developer.gnome.org/gtk3/stable/GtkOverlay.html). –

Répondre

1

Je ne pense pas qu'il y ait un conteneur approprié dans GTK standard. Je sous-classerais Gtk :: Fixe ... c'est toujours le plus proche que vous pouvez obtenir, et si vous utilisez gtkmm alors le sous-classement ne devrait pas être très difficile¹. Ensuite, vous pouvez contrôler les dimensions de tous les widgets, en étirant un enfant sélectionné pour remplir l'espace.

Pour contrôler l'axe Z, vous devrez probablement manipuler les fenêtres X du widget - vérifiez la documentation GDK sur le sujet de Windows GDK². Je me souviens que dans PyGTK chaque widget a la propriété gtk.Widget.window, je suppose que la même chose est pour gtkmm. Cela suppose que tous vos widgets enfants ont des fenêtres X, donc f.e. vous devrez envelopper Gtk :: Label dans Gtk :: EventBox.

¹ 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

Merci. J'espérais que cela serait fourni par Gtk +. – c4757p

3

J'ai eu cette question exacte à l'aide d'un Gtk :: fixe (en fait gtk.Fixed - pygtk - mais je pense qu'il est tout de même en dessous) et j'ai pu pour le manipuler assez facilement en manipulant la fenêtre de chaque widget. Dans mon cas, les widgets sont déjà des instances d'EventBox, et je devais juste m'assurer que celle que je traînais était en haut, sinon elle glissait sous d'autres, ce qui me paraissait tout à fait faux. La solution était aussi simple que d'appeler "widget.window.raise_()" pour élever la fenêtre sous-jacente du widget lorsque le widget a été cliqué pour commencer le glisser.

Donc, je ne fais que réaffirmer que la réponse précédente fonctionne, mais je voulais souligner que c'est plutôt facile. Il semble que vous deviez créer des EventBox pour contenir vos widgets, mais après cela, cela devrait fonctionner.

Vous pouvez voir le code que je travaillais sur au http://github.com/divegeek/BlockHead

+0

Merci! Je vais jeter un coup d'oeil à ça. – c4757p

+0

Cet exemple de code est-il toujours disponible quelque part? THX! – jedierikb

+0

C'est. http://github.com/jjposner/BlockHead – divegeek