Вопрос

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

Это было полезно?

Решение

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

Чтобы управлять осью Z, вам, вероятно, потребуется манипулировать окнами X виджета - проверьте документацию GDK по теме GDK windows2.Я помню, что в PyGTK у каждого виджета есть свойство gtk.Widget.window, я думаю, что то же самое относится и к gtkmm.Это предполагает, что все ваши дочерние виджеты имеют X windows, так что, например.вам нужно будет обернуть 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

Другие советы

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

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

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

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

Я смог сделать именно это -

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

в gtk2 с помощью GtkFixed разрабатываем подходящий порядок вставки (первая вставленная - снизу, последняя вставленная - сверху) и - самое главное!! - принудительное использование GtkFixed для создания собственного окна:

`f := gtk_fixed_new();
gtk_widget_set_has_window(f, 1);`

Если вы не выполните set_has_window(f, 1), все дочерние окна будут вставлены в какой-либо родительский виджет / окно (см. gtk_fixed_realize() в gtkfixed.c), и это может привести к беспорядку z-порядка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top