Gtk&x2B;三,;C&;沼泽地问题
我试图在Linux上用C和Glade制作一个简单的Gui程序。 我写了一个简单的程序,用Glade设计了一个窗口。 当我运行代码时,它会说:Gtk&x2B;三,;C&;沼泽地问题,c,linux,gtk3,glade,C,Linux,Gtk3,Glade,我试图在Linux上用C和Glade制作一个简单的Gui程序。 我写了一个简单的程序,用Glade设计了一个窗口。 当我运行代码时,它会说: (gtk-test:23026): Gtk-CRITICAL **: gtk_widget_show: assertion ‘GTK_IS_WIDGET(widget)’ failed 没有窗户开着。 我在网上搜索了一下,但找不到任何有用的东西。有人说我必须将glade文件转换为.xml,但这不起作用 C #包括 int main(int argc,ch
(gtk-test:23026): Gtk-CRITICAL **: gtk_widget_show: assertion ‘GTK_IS_WIDGET(widget)’ failed
没有窗户开着。
我在网上搜索了一下,但找不到任何有用的东西。有人说我必须将glade文件转换为.xml,但这不起作用
C
#包括
int main(int argc,char*argv[])
{
GtkBuilder*builder;
GtkWidget*窗口;
gtk_init(&argc,&argv);
builder=gtk_builder_new();
gtk_生成器_从_文件添加_(生成器,“window_main.glade”,NULL);
窗口=GTK_小部件(GTK_生成器_获取_对象(生成器,“窗口主”);
gtk_builder_connect_信号(builder,NULL);
g_object_unref(建筑商);
gtk_widget_show(窗口);
gtk_main();
返回0;
}
窗口上的无效\u主\u销毁()
{
gtk_main_quit();
}
林间空地
假的
测试窗口
640
480
您似乎手动添加了xml标记,但格式不正确。同时,您没有从gtk\u builder\u add\u from\u file
功能执行任何错误检查
您的xml以以下内容开头:
<?xml version=1.0 encoding=UFT-8>
编译时使用:
gcc -rdynamic -o window main.c `pkg-config --cflags --libs gtk+-3.0`
是的,我手工添加,因为我现在只打印出来。我是gtk的新手,所以我不知道你对GError是什么意思。你能给我解释一下吗?搜索会有帮助:他们也不会检查
gtk\u builder\u get\u object()
的返回值是否为NULL
,这表示查找失败,当然也会使它是有效的GtkWidget*
的断言失败。它会抱怨,因为窗口上的信号处理程序\u main\u destroy
不在main.c
上。-rdynamic是一个gcc标志,因为您在gladexml中定义了信号处理程序。我将编辑答案以添加信号处理程序。是的,您可以将-rdynamic添加到gcc中,但目标只是验证您遇到的具体问题。关于eclipse,这是另一个问题,我不确定我是否能帮助您。我不使用eclipse,它特定于eclipse调用编译器的方式,等等UFT
-=>UTF
以及José所说的,一旦加载了没有GError
的文件,您还应该检查gtk_builder\u get_object()
的返回值是否为NULL
,这表示查找失败,当然会使断言它是有效的GtkWidget*
失败。在这种情况下,它可能会失败,因为文件没有成功加载,但您至少应该验证查找是否成功,至少在您巩固了.ui
文件的结构并知道它总是会成功之前是这样。错误检查的存在是有原因的-停止只是推土过去,期待事情能够正常进行。我将使用GError示例和@下划线\u d来更新答案,以正确指示检查结果og builder get object函数/方法。
<?xml version=1.0 encoding=UFT-8>
<?xml version="1.0" encoding="UTF-8"?>
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GError *err = NULL;
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "window_main.glade", &err);
if (err != NULL) {
fprintf (stderr, "Unable to read file: %s\n", err->message);
g_error_free(err);
return 1;
}
window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
if (window == NULL || !GTK_IS_WINDOW(window)) {
fprintf (stderr, "Unable to get window. (window == NULL || window != GtkWindow)\n");
return 1;
}
gtk_builder_connect_signals(builder, NULL);
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
void on_window_main_destroy(GtkWidget *widget, gpointer user_data)
{
gtk_main_quit();
}
gcc -rdynamic -o window main.c `pkg-config --cflags --libs gtk+-3.0`