【问题标题】:Using custom widgets with glade / Gtkbuilder在 glade / Gtkbuilder 中使用自定义小部件
【发布时间】:2010-06-09 00:01:19
【问题描述】:

我正在使用 Gtk 和 Glade 开发一个应用程序。我的印象是,为你的主窗口创建一个 GtkWindow 的子类是一种常见的做法,但我坚持如何从 GtkBuilder 定义中构造我的子类。有人知道怎么做吗?

【问题讨论】:

标签: gtk glade gtkbuilder


【解决方案1】:

子类化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 中执行此操作,但除此之外,我发现它工作得很好。

【讨论】:

  • 这看起来不错。我一直在研究 GNOME 源代码以了解它们是如何做到的,并且它们是 GtkWindow 的子类。不过,我不确定他们是否使用了您概述的技术。
  • 您在看哪些应用程序?我有时会查看 Gedit 以了解如何做事的示例,但它巨大。
  • 我也经常看Gedit。但事实证明,Gedit 实际上并没有使用 GtkBuilder——事实上,我很确定标准的 GNOME 应用程序都没有。我认为这解释了我的困惑——我希望任何头脑正常的人都想使用 GtkBuilder。
  • GtkBuilder 相对较新,因此较旧的应用程序必须移植旧代码才能使用它。此外,它可能对具有静态界面的简单应用程序更有用...
  • 实际上,在复杂的应用程序中,GtkBuilder 是绝对不可缺少的。如果应用程序很简单,带有一个静态界面,您可以直接在代码中构建 GUI,然后忘记它。
【解决方案2】:

继承 GtkWindow 并不常见。

我认为不可能对从 gtkbuilder 定义创建的顶级窗口进行子类化。

gtkbuilder 需要在创建之前了解您的子类小部件。

【讨论】:

  • 是可以做到的,无数的 GNOME 应用都做到了,e.g.待办事项、照片、日历...
【解决方案3】:

如果你真的想创建自己的 GtkWindow 子类,ptomato 很好地描述了基本步骤。也可以为 glade 创建插件以使您的自定义小部件可用。但这并不容易,而且很可能不是您想要做的。

大多数应用程序只使用标准小部件,而没有对它们进行子类化。然后用 gtkbuilder(或 libglade)加载一个 glade 文件,你不需要为你的 GUI 有一个特殊的类(就像在其他一些 RAD 工具中一样),你只需得到一组对象。 API 允许您按名称查找它们(窗口基本上只是其中之一)。一种常见的方法是在程序启动时查找您将与之交互的所有小部件并将它们存储在全局变量中。或者,如果您需要窗口的多个实例,您可以创建一个结构来存储它们。或者您可以在每次需要时简单地查找小部件。请注意,您获得的对象集是完全动态的。例如,您可以在不同窗口之间移动小部件,就像您以编程方式创建 GUI 一样。

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多