Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gtk&x2B;三,;C&;沼泽地问题_C_Linux_Gtk3_Glade - Fatal编程技术网

Gtk&x2B;三,;C&;沼泽地问题

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

我试图在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,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`