gpt4 book ai didi

c - 处理来自 XML 文件构建的 gtkwidget 的事件

转载 作者:行者123 更新时间:2023-11-30 14:26:17 26 4
gpt4 key购买 nike

我正在用 C 语言编写一个图形程序,其中有一个从 XML 文件构建的 GTK 窗口。该窗口有几个按钮和对应的处理程序(例如,如果按钮显示“circle”,则有一个名为“on_circle_clicked()”的处理程序)。我想在单击这些按钮时处理事件。我该怎么做?

最佳答案

信号处理代码位于您的信号处理程序中。根据您的示例,如果您按钮“circle”,其中“clicked”的信号处理程序为“on_circle_clicked”,那么当单击按钮时,将调用 on_circle_clicked,这将具有处理该按钮单击的逻辑。为此,请使用 glade (生成您正在使用的 xml 文件类型)是通过在创建 xml 文件时为小部件添加信号处理程序的名称。然后,必须在源代码中实现这些信号处理程序。您可能会发现these links有用。请参阅以下示例供您引用:
示例.c

/* Compile as :gcc sample.c  -Wall -Wextra -Wl,--export-dynamic `pkg-config --cflags --libs gtk+-3.0 gmodule-export-2.0` -o sample */
#include <gtk/gtk.h>

void on_circle_clicked(GtkButton * b, gpointer data)
{
(void)b;
(void)data;
printf(" Circle clicked\n");
}

int main(int argc, char **argv)
{
GtkBuilder *builder;
GtkWidget *window;
GError *err = NULL;
const char *builder_file = "sample.glade";

gtk_init(&argc, &argv);
builder = gtk_builder_new();
if (gtk_builder_add_from_file(builder, builder_file, &err) == 0) {
fprintf(stderr, "Error adding builder from file %s\n%s\n",
builder_file, err->message);
return -1;
}
gtk_builder_connect_signals(builder, NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
if (window == NULL) {
fprintf(stderr, " Object window not found\n");
return -2;
}
gtk_widget_show_all(window);
gtk_main();

return 0;
}

样本.glade

<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Glade sample</property>
<property name="has_resize_grip">False</property>
<signal name="destroy" handler="gtk_main_quit" swapped="no"/>
<child>
<object class="GtkButton" id="circle">
<property name="label" translatable="yes">circle</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="on_circle_clicked" swapped="no"/>
</object>
</child>
</object>
</interface>

需要注意的事项:

  1. gtk_builder_connect_signals 的文档中所述,您应该在 Linux/Unix 上使用 -Wl,--export-dynamic cflags编译您的程序并链接到 gmodule-export-2.0。在 Windows 上,您需要在信号处理程序之前添加 G_MODULE_EXPORT
  2. 在查找信号处理程序符号时,不要将其设置为静态函数或隐藏该函数(例如设置函数的可见性属性作为 gcc 的“隐藏”)

希望这有帮助!

关于c - 处理来自 XML 文件构建的 gtkwidget 的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9331974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com