【问题标题】:How do I find out what GDK events are required for a GTK+ signal?如何找出 GTK+ 信号需要哪些 GDK 事件?
【发布时间】:2009-04-30 18:17:01
【问题描述】:

我正在使用 Glade-3 进行 GUI 设计,但我一直遇到这个问题。我在 GTK+ 文档映射信号到事件或 Glade-3 (3.4.5) 中看不到任何内容。 GTK+ 源代码中是否有地方可以找到这些信息?

注意:在这个问题中,重要的是要认识到事件和信号在 GTK 中不是一回事。

例子:

我有一个事件框,它需要以下事件才能接收以下信号。如何确定给定信号需要哪些事件?

Events: GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK
Signals: leave_notify_event, enter_notify_event

【问题讨论】:

    标签: gtk glade gdk


    【解决方案1】:

    好的,我想我现在明白你的意思了,我发现这张表匹配了 gtk 信号和 gdk 事件。 Here it is.

    【讨论】:

    • 该链接现已损坏,但this one 有效(目前)。
    【解决方案2】:

    假设我已经正确解释了您的问题,您希望将 Glade 文件中指定的信号连接到源代码中的函数。你如何做到这一点取决于你是使用 libglade 来加载文件生成还是 GtkBuilder,两者都是相似的,但我将在 C 中给出示例以完成。

    使用 libglade 你会这样做:

    GladeXml *xml = glade_xml_new(filename, NULL, NULL); // Load the file
    glade_xml_signal_autoconnect(xml); // Connect the signals
    

    使用 GtkBuilder 会是这样的:

    GtkBuilder *xml = gtk_builder_new();
    gtk_builder_add_from_file(xml, filename, NULL); // Load the file
    gtk_builder_connect_signals(xml, NULL); // Connect the signals
    

    使用 GtkBuilder 时,信号连接函数中的第二个参数可以替换为指向数据的指针,然后将其传递给信号处理程序。

    今后我建议使用 GtkBuilder,因为 libglade 即将被弃用。

    链接

    这里是上面提到的两个函数的相关文档的链接

    【讨论】:

    • 这是一个很好的答案,但这不是我问题的答案。我要更新这个问题,因为它显然不清楚。
    【解决方案3】:

    您可以使用gdk_event_handler_set()捕获事件

    首先在启动时注册自己的 GDK 事件处理程序:

    gdk_event_handler_set(my_gdk_event_handler, NULL, NULL);
    

    ... 然后用它打印出任何有用的信息,别忘了通过gtk_main_do_event() 将事件传递给 GTK+,如下所示:

    void my_gdk_event_handler(GdkEvent *event, gpointer data)
    {
        printf("Received GdkEvent of type %d", event->type);
    
        gtk_main_do_event(event); // Pass event to GTK+
    }
    

    【讨论】:

    • 我正在寻找类似于 DoR 答案中给出的表格(现在包含断开的链接)。但是,如果我理解正确,您的答案是关于如何通过插入调试事件处理程序自己弄清楚给定信号触发了哪些事件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多