2009-06-30 6 views
2

Есть ли способ в Gtk + уложить один виджет поверх другого - не считая GtkFixed? GtkFixed не работает хорошо по двум причинам: 1) Мне нужен Z-порядок, и 2) Мне нужен один виджет, чтобы растянуть и заполнить предоставленное пространство.Укладка виджетов в Gtk +

+0

Вы просто хотите отобразить один виджет в данном месте и в одно время, заполняя пространство, или что-то более сложное? – liori

+0

Я хочу отобразить один виджет, заполняющий все пространство, а затем еще один сверху в фиксированном месте, одновременно видимый. – c4757p

+0

В настоящее время да, есть точно виджет, который позволяет управлять Z-порядком и выравниванием: ['GtkOverlay'] (https://developer.gnome.org/gtk3/stable/GtkOverlay.html). –

ответ

1

Я не думаю, что в стандартном GTK есть надлежащий контейнер. Я бы подкласса Gtk :: Fixed ... он по-прежнему самый близкий, который вы можете получить, и если вы используете gtkmm, то подклассификация не должна быть очень сложной¹. Затем вы можете управлять размерами всех виджетов, растягивая один выбранный дочерний элемент для заполнения пробела.

Для управления осью Z вам, вероятно, понадобится управлять окнами X виджета - проверьте документацию GDK на тему Windows GDK. Я помню, что в PyGTK у каждого виджета есть свойство gtk.Widget.window, я думаю, что то же самое для gtkmm. Это предполагает, что все дочерние виджеты имеют X-окна, поэтому f.e. вам нужно будет обернуть Gtk :: Label внутри 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

Спасибо. Я надеялся, что это будет предоставлено Gtk +. – c4757p

3

Я имел этот точный вопрос, используя Gtk :: Fixed (на самом деле gtk.Fixed - PyGTK - но я думаю, что это все под тем же), и я был в состоянии легко справиться с этим, манипулируя окном каждого виджета.

В моем случае виджеты уже являются экземплярами EventBox, и мне просто нужно было убедиться, что тот, который я перетаскивал, был сверху, потому что в противном случае он скользит под другими, что выглядело совершенно неправильно. Решение было так же просто, как вызвать «widget.window.raise_()», чтобы поднять основное окно виджета при щелчке виджета, чтобы начать перетаскивание.

Так что я в основном просто подтверждаю, что предыдущий ответ работает, но я хотел бы указать, что на самом деле это довольно легко. Похоже, вам может понадобиться создать несколько EventBoxes для хранения ваших виджетов, но после этого он должен просто работать.

Вы можете увидеть код, который я работал над в http://github.com/divegeek/BlockHead

+0

Спасибо! Я посмотрю на это. – c4757p

+0

Этот код кода все еще доступен где-то? Спасибо! – jedierikb

+0

Это так. http://github.com/jjposner/BlockHead – divegeek

Смежные вопросы