在 Gtk+ 中堆叠小部件

Posted

技术标签:

【中文标题】在 Gtk+ 中堆叠小部件【英文标题】:Stacking widgets in Gtk+ 【发布时间】:2009-06-30 20:55:10 【问题描述】:

在 Gtk+ 中有没有办法将一个小部件堆叠在另一个之上——不包括 GtkFixed? GtkFixed 不能很好地工作有两个原因:1)我需要 Z 顺序,2)我需要一个小部件来拉伸和填充提供的空间。

【问题讨论】:

您只想一次在给定位置显示一个小部件、填充空间还是更复杂的东西? 我想显示一个小部件填充整个空间,然后在顶部的固定位置显示另一个小部件,两者同时可见。 现在,是的,确实有一个小部件可以控制 Z 顺序和对齐方式:GtkOverlay 【参考方案1】:

我在使用 Gtk::Fixed(实际上是 gtk.Fixed -- pygtk -- 但我认为它在下面都是一样的)时遇到了这个确切的问题,并且我能够通过操纵每个小部件的窗口来轻松处理它。

在我的例子中,小部件已经是 EventBox 实例,我只需要确保我拖动的那个在上面,否则它会滑到其他下面,这看起来很不对劲。解决方案很简单,只需在单击小部件开始拖动时调用“widget.window.raise_(​​)”来提升小部件的底层窗口。

所以我基本上只是重申前面的答案有效,但我想指出它实际上很容易。听起来您可能需要创建一些 EventBox 来保存您的小部件,但之后它应该就可以工作了。

你可以在http://github.com/divegeek/BlockHead看到我正在编写的代码

【讨论】:

谢谢!我会看看这个。【参考方案2】:

我认为标准 GTK 中没有合适的容器。我会将 Gtk::Fixed 子类化...它仍然是您可以获得的最接近的子类,如果您使用 gtkmm,那么子类化应该不会很困难¹。然后你可以控制所有小部件的尺寸,拉伸一个选定的孩子来填充空间。

要控制 Z 轴,您可能需要操作小部件的 X 窗口——查看有关 GDK 窗口² 主题的 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

【讨论】:

谢谢。我希望这将由 Gtk+ 提供。【参考方案3】:

我能够做到这一点 -

显示一个小部件填充整个空间,然后在顶部固定位置显示另一个,两者同时可见

在 gtk2 中使用 GtkFixed,计算出合适的插入顺序(第一个插入 - 底部,最后插入 - 顶部),并且 - 最重要的是!! - 强制 GtkFixed 拥有自己的窗口:

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

如果您不执行 set_has_window(f, 1),所有子窗口都将插入到某个父窗口小部件/窗口中(参见 gtkfixed.c 中的 gtk_fixed_realize()),这可能会造成 z 顺序混乱。

【讨论】:

以上是关于在 Gtk+ 中堆叠小部件的主要内容,如果未能解决你的问题,请参考以下文章

Gtk3用另一个小部件替换子小部件

如何更改 GTK 容器小部件的大小?

如何计算存储在 Gtk::Grid 中的小部件?

GTK:无限的惰性小部件列表

GTKmm - 无法将固定大小设置为 Gtk::Scale 小部件

在 Gtk::Entry 小部件中强制输入数字