GTK Glade需要帮助

4

我正在使用Glade制作用户界面。

我已经成功生成了Glade文件。

现在我需要将这个文件包含在我的C代码中。

我正在使用以下代码:

#include <stdlib.h>
#include<gtk/gtk.h>
int main (int argc, char *argv[])
{
GtkWidget *builder,*window,*button;
gtk_init (&argc, &argv);
builder=gtk_builder_new();
gtk_builder_add_from_file(builder,"shiv.glade",NULL);
window=GTK_WIDGET (gtk_builder_get_object(builder,"window1")) ;
button=GTK_WIDGET (gtk_builder_get_object(builder,"button1"));
g_object_unref(G_OBJECT(builder));
gtk_widget_show(button);
gtk_widget_show(window);
gtk_main ();
return 0;
}

我的UI是一个简单的窗口,只有一个没有回调函数的按钮。

执行时出现以下错误:

GTK-CRITICAL **: IA__gtk_widget_show assertion 'GTK_IS_WIDGET(widget)' failed

这个问题属于StackOverflow。(可能已经在SO上被问过和回答了。) - kraxor
1个回答

2

修改:

GtkWidget *builder,*window,*button;

使用:

GtkWidget *window,*button;
GtkBuilder *builder;

这应该会解决问题。

示例:

#include <stdlib.h>
#include <gtk/gtk.h>

static void 
close_window ( GtkWidget *widget, gpointer window)
{
    printf("application close...\n");
    gtk_widget_destroy((GtkWidget*)window);
}

int main (int argc, char *argv[])
{
    GtkWidget *window, *button;
    GtkBuilder *builder; 

    gtk_init (&argc, &argv);
    builder=gtk_builder_new();
    gtk_builder_add_from_file(builder,"a.glade",NULL);

    window = GTK_WIDGET (gtk_builder_get_object(builder,"window1")) ;
    button = GTK_WIDGET (gtk_builder_get_object(builder,"button1"));

    g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (close_window),window);
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));

    g_object_unref(G_OBJECT(builder));
    gtk_widget_show_all( window );
    gtk_main ();
    return 0;
}

来自GTK3参考手册
GtkBuilder — 从XML UI定义构建界面;
GtkWidget — 所有小部件的基类


之后我声明了GObject *window,*button并从gtk_builder_get_object中删除了类型转换,这样就可以正常工作了。请说明GtkWidget和GObject之间的区别。 - shiv garg
@shivgarg 我在我的答案中加入了一个例子。希望这能帮到你。 - girardengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接