GTK+3&Glade问题

人气:407 发布:2022-10-16 标签: linux c gtk3 glade

问题描述

我试图在Linux上用C和Glade制作一个简单的gui程序。 我写了一个简单的程序,并用Glade设计了一个窗口。 当我运行代码时,它显示:

(gtk-test:23026): Gtk-CRITICAL **: gtk_widget_show: assertion ‘GTK_IS_WIDGET(widget)’ failed

并且没有任何窗口打开。 我在网上搜索了一下,但找不到任何有用的东西。有人说我必须将GLADE文件转换为.xml,但这不起作用。

C

#include <gtk/gtk.h>

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

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "window_main.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
    gtk_builder_connect_signals(builder, NULL);

    g_object_unref(builder);

    gtk_widget_show(window);                
    gtk_main();

    return 0;
}

void on_window_main_destroy()
{
    gtk_main_quit();
}

林地

<?xml version=1.0 encoding="UFT-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
    <requires lib="gtk+" version="3.12"/>
    <object class="GtkWindow" id="window_main">
        <property name="can_focus">False</property>
        <property name="title" translatable="yes">Test Window</property>
        <property name="default_width">640</property>
        <property name="default_height">480</property>
        <signal name="destroy" handler="on_window_main_destroy" swapped="no"/>
        <child>
            <placeholder/>
        </child>
    </object>
</interface>

推荐答案

您似乎手动添加了xml标记,但它的格式不正确。同时,您不会从gtk_builder_add_from_file函数执行任何错误检查。

您的XML以:

开头
<?xml version=1.0 encoding=UFT-8>

,应为:

<?xml version="1.0" encoding="UTF-8"?>

若要避免这种情况,您应该使用GError并检查在使用gtk_builder_add_from_file分析生成器文件时是否有错误。

编辑:

我看到您已经更新了问题中的GLADE文件。如果你这样做了,那么答案可能并不明显。无论如何,以下是您的代码,其中包含对GLADE文件是否存在的错误检查以及@underscore_d检查GtkBuilder get_object函数的提示(可以改用g_assert宏):

#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
", 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)
");
        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`

850