我刚开始使用Gtk+,我正在遵循本教程如何创建第一个应用程序,但当我尝试运行可执行文件时,我收到以下错误:
Gtk-Critical **: gtk_widget_show assertion GTK_IS_WIDGET(WIDGET)我可以在谷歌上看到很多人犯了同样的错误,但我看不到如何解决这个问题的回复。
我的C代码:
#include <stdlib.h>
#include <gtk/gtk.h>
GtkBuilder *builder;
GtkWidget *app;
G_MODULE_EXPORT
void on_app_destroy (void)
{
gtk_main_quit ();
}
G_MODULE_EXPORT
void on_menu_quit_activate (void)
{
gtk_main_quit ();
exit(EXIT_SUCCESS);
}
int main (int argc, char *argv[])
{
/* Initialize GTK+ */
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "tut.glade", NULL);
app = GTK_WIDGET (gtk_builder_get_object (builder, "app"));
gtk_builder_connect_signals (builder, NULL);
g_object_unref (G_OBJECT (builder));
/* Enter the main loop */
gtk_widget_show (app);
gtk_main ();
return 0;
}glad文件:
<?xml version="1.0"?>
<glade-interface>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="window1">
<child>
<widget class="GtkFixed" id="fixed1">
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="width_request">113</property>
<property name="height_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</widget>
<packing>
<property name="x">149</property>
<property name="y">69</property>
</packing>
</child>
</widget>
</child>
</widget>
<widget class="GtkWindow" id="window2">
<child>
<placeholder/>
</child>
</widget>
</glade-interface>编译选项:
`pkg-config --cflags --libs gtk+-2.0` -export-dynamic链接器设置:
-export-dynamic我的IDE:代码::块,编译器: GNUC编译器
如何解决这个问题?提前谢谢。
发布于 2012-01-23 12:04:22
问题是在您的glade文件中没有id为app的对象。如果您想要显示窗口,您必须传递与窗口关联的id,即window1。因此,您的代码可以更改为:
app = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
if (NULL == app)
{
/* Print out the error. You can use GLib's message logging */
fprintf(stderr, "Unable to file object with id \"window1\" \n");
/* Your error handling code goes here */
}没有什么其他的建议了:
gtk_builder_add_from_file调用中最好使用GError **参数。因此,使用下面这段代码作为参考,而不仅仅是gtk_builder_add_from_file:GError *err = NULL; /* It is mandatory to initialize to NULL */
...
if(0 == gtk_builder_add_from_file (builder, "tut.glade", &err))
{
/* Print out the error. You can use GLib's message logging */
fprintf(stderr, "Error adding build from file. Error: %s\n", err->message);
/* Your error handling code goes here */
}
...glade-interface表示您正在使用libglade格式而不是GtkBuilder格式来保存glade文件。因此,您可能需要在构建中链接libglade。但是从glade文件中可以看出,Gtk版本是2.16或更高版本,您可能需要使用GtkBuilder格式。在这种情况下,您将需要转换为GtkBuilder格式,这可以使用gtk-builder-convert脚本或在glade应用程序中打开Glade文件&保存为GtkBuilder格式(此选项将取决于您的Glade版本)。希望这能有所帮助!
https://stackoverflow.com/questions/8966420
复制相似问题