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

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

【问题讨论】:

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

标签: user-interface gtk gtkmm


【解决方案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 顺序混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2018-11-25
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多