我正在用 Gtk 和 Glade 开发一个应用程序。我的印象是,为你的主窗口创建一个 GtkWindow 的子类是一种常见的做法,但我坚持如何从 GtkBuilder 定义中构造我的子类。有谁知道怎么做?
3 回答
子类化GtkWindow
在 GTK 的各种语言绑定中比在纯 C 中更常见。您没有提到您使用的是哪种语言。
也就是说,我GtkWindow
在 C 中子类化的方式是在 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 中执行此操作,但除此之外,我发现它工作得很好。
如果你真的想创建自己的 GtkWindow 子类,ptomato 很好地描述了基本步骤。也可以为 glade 创建插件以使您的自定义小部件可用。但这并不是很容易,而且很可能不是您想要做的。
大多数应用程序只使用标准小部件,而没有对它们中的任何一个进行子类化。然后用 gtkbuilder(或 libglade)加载一个 glade 文件,你不需要为你的 GUI 有一个特殊的类(就像在其他一些 RAD 工具中一样),你只需得到一组对象。API 允许您按名称查找它们(窗口基本上只是其中之一)。一种常见的方法是在程序启动时查找您将与之交互的所有小部件并将它们存储在全局变量中。或者,如果您需要窗口的多个实例,您可以创建一个结构来存储它们。或者您可以在每次需要时简单地查找小部件。请注意,您获得的对象集是完全动态的。例如,您可以在不同窗口之间移动小部件,就像您以编程方式创建 GUI 一样。
子类化 GtkWindow 并不常见。
我认为不可能对从 gtkbuilder 定义创建的顶级窗口进行子类化。
gtkbuilder 在创建之前需要了解您的子类小部件。