我正在用Gtk和Glade开发一个应用程序。我的印象是,为您的主窗口创建GtkWindow的子类是常见的做法,但我仍然坚持如何从GtkBuilder定义构造我的子类。有谁知道怎么做?
答案 0 :(得分:6)
子类GtkWindow
在GTK的各种语言绑定中比在普通C中更常见。您没有提到您正在使用的语言。
也就是说,我在C中继承GtkWindow
的方式是在Glade中创建窗口的内容,但不是窗口本身。在Glade 3(IIRC)中,您可以右键单击选项板中的小部件,然后选择“将小部件添加为顶级”以放置一个没有容器的非顶级小部件。
然后为GtkWindow
的子类编写代码,我们称之为MyAppWindow
。由于GObject文档中有大量示例,因此我不会在此答案中进行讨论。在init函数(my_app_window_init()
)中加载Glade文件,使用gtk_builder_get_object()
获取指向Glade文件中最外层窗口小部件的指针,并使用gtk_container_add()
将其添加到窗口中构建。然后像往常一样使用gtk_builder_connect_signals()
。
你必须以这种方式手动设置所有窗口的属性,因为你不能在Glade中这样做,但除此之外我发现它的效果非常好。
答案 1 :(得分:1)
继承GtkWindow是不常见的做法。
我认为不可能继承从gtkbuilder定义创建的顶层窗口。
gtkbuilder在创建之前需要了解您的子类窗口小部件。
答案 2 :(得分:0)
如果你真的想创建自己的GtkWindow子类,ptomato很好地描述了基本步骤。也可以为glade创建插件,以使您的自定义小部件可用。但这并不容易,很可能不是你想做的事情。
大多数应用程序仅使用标准小部件而不对其中任何一个进行子类化。然后用gtkbuilder(或libglade)加载一个glade文件,你不需要为你的GUI设置一个特殊的类(就像在其他一些RAD工具中一样),而只需要获得一组对象。 API允许您按名称查找它们(窗口基本上只是其中之一)。一种常见的方法是查找要与之交互的所有小部件,并在程序启动时将它们存储在全局变量中。或者,如果您需要窗口的多个实例,则可以创建一个结构来存储它们。或者您可以在每次需要时简单地查找窗口小部件。请注意,您获得的对象集是完全动态的。例如,您可以在不同窗口之间移动窗口小部件,就像以编程方式创建GUI一样。