Gtk+ 中有没有办法将一个小部件堆叠在另一个之上——不包括 GtkFixed?GtkFixed 不能很好地工作有两个原因:1)我需要 Z 顺序,2)我需要一个小部件来拉伸和填充提供的空间。
3 回答
我使用 Gtk::Fixed 遇到了这个确切的问题(实际上是 gtk.Fixed -- pygtk -- 但我认为它在下面都是一样的)并且我能够通过操纵每个小部件的窗口来很容易地处理它。
就我而言,小部件已经是 EventBox 实例,我只需要确保我拖动的那个在顶部,否则它会滑到其他小部件下面,这看起来很不对劲。解决方案很简单,只需在单击小部件开始拖动时调用“widget.window.raise_()”来提升小部件的底层窗口。
所以我基本上只是重申前面的答案有效,但我想指出它实际上很容易。听起来您可能需要创建一些 EventBoxes 来保存您的小部件,但之后它应该就可以工作了。
您可以在http://github.com/divegeek/BlockHead看到我正在处理的代码
我认为标准 GTK 中没有合适的容器。我会将 Gtk::Fixed 子类化...它仍然是您可以获得的最接近的子类,如果您使用 gtkmm,那么子类化应该不会很困难¹。然后您可以控制所有小部件的尺寸,拉伸一个选定的子部件以填充空间。
要控制 Z 轴,您可能需要操作小部件的 X 窗口——查看有关 GDK 窗口² 主题的 GDK 文档。我记得在 PyGTK 中每个小部件都有 gtk.Widget.window 属性,我想 gtkmm 也是如此。这假设你所有的子部件都有 X 窗口,所以你需要将 Gtk::Label 包装在 Gtk::EventBox 中。
¹ http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/chapter-customwidgets.html
我能够做到这一点 -
显示一个小部件填充整个空间,然后在顶部的固定位置显示另一个,两者同时可见
在 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 顺序混乱。