在GTK+的.ui文件中制作已知的子类wigets



我在GNOME日历应用程序中查找,gcal-window.ui文件中有以下行(在292上(:

<object class="GcalQuickAddPopover" id="quick_add_popover">

gcal-windowui、源代码和头文件所在的同一目录中,有一个文件定义了GcalQuickAddPopover。使.ui文件知道哪些对象存在,哪些对象不存在的规则是什么。如果我删除了gcal快速添加popover文件,它怎么会知道或不知道它在那里?

GtkBuilder UI定义中可以使用的类型是在解析XML之前在运行时注册的类型(通常通过调用gtk_builder_new或类似方法(。

这里有一个自包含的例子来说明这一点。

/* cc ui.c -o ui $(pkg-config --cflags --libs gtk+-3.0) */
#include <gtk/gtk.h>

/* Define new type (MyCustomLabel) */
#define MY_TYPE_CUSTOM_LABEL my_custom_label_get_type()
struct _MyCustomLabel { GtkLabel label; };
G_DECLARE_FINAL_TYPE(MyCustomLabel, my_custom_label, MY, CUSTOM_LABEL, GtkLabel)
G_DEFINE_TYPE(MyCustomLabel, my_custom_label, GTK_TYPE_LABEL)
static void
my_custom_label_class_init(MyCustomLabelClass *cls)
{
}
static void
my_custom_label_init(MyCustomLabel *label)
{
gtk_label_set_label(GTK_LABEL(label), "This is my custom label");
}

/* Test case */
static const gchar *ui =
"<interface>"
"<object id='W' class='GtkWindow'>"
"<child>"
"<object class='MyCustomLabel'/>"
"</child>"
"</object>"
"</interface>";

int main()
{
GtkBuilder *builder;
GtkWidget *window;
gtk_init(NULL, NULL);
/* Ensures that MyCustomLabel has been registered with the type
* system. Without this call, the application crashes when parsing
* `ui`, i.e. at the `gtk_builder_new_from_string` call. */
g_type_ensure(MY_TYPE_CUSTOM_LABEL);
builder = gtk_builder_new_from_string(ui, -1);
window = GTK_WIDGET(gtk_builder_get_object(builder, "W"));
g_object_unref(builder);
gtk_widget_show_all(window);
gtk_main();
return 0;
}

有关类型系统如何工作的更多详细信息,请参阅GObject文档。

最新更新