widget - 在 GTK+ 的 .gui 文件中制作已知的子类小部件

标签 widget gtk subclass glade

我正在查看 GNOME 日历应用程序,gcal-window.ui 文件中有这一行(位于 292):

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

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

最佳答案

可以在GtkBuilder UI definition内部使用的类型是在解析 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 documentation有关类型系统如何工作的更多详细信息。

关于widget - 在 GTK+ 的 .gui 文件中制作已知的子类小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70043209/

相关文章:

Android 小部件未更新

flutter - 在Flutter中按下按钮后更新文本

ios - 为什么即使包含应用程序在前台,iOS 小部件也不会及时刷新

linux - ADA & GTK => 函数 Get_Text

linux - 我如何找出我的代码在哪里导致 GLib-GObject-CRITICAL?

c - 客户端装饰如何与 Gnome 3.10 和 GTK 3 配合使用?

swift - 如何在 Swift 中从子类内的函数获得多个返回值

android - 删除并重新添加后小部件点击不起作用

objective-c - 如何通过类别扩展向 NSMutableArray 添加属性?

jsf - @ManagedBean和@XxxScope可以放在基类中吗?