C语言 GTK 3按钮信号错误

de90aj5v  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(95)

我试着用C语言做一个简单的GTK 3窗口,当主程序中发生错误时,它会显示一个错误消息,向用户显示发生了什么错误。但是,当我尝试将gtk_main_quit函数连接到按钮时,GTK进程会抛出这些错误:
第一个月
GLib-GObject-CRITICAL **: 16:04:36.795: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
然后我被如何解决这个问题难住了。也许我没有正确初始化菜单?
我构造它的方式是通过一个全局结构,在单独的函数中调用和分配,不会抛出错误。
下面是函数的完整代码

int mensagem_erro()
 {
    GtkBuilder *construtor = NULL;

    printf("Alocando a janela...\n");
    construtor = malloc(sizeof construtor);

    alojar_erro();

    printf("Gerando a mensagem de erro...\n");
    snprintf(modelo_estrutura_erro->string_erro, TAMANHO_STRING_ERRO-1,"Erro! Erro n %i, 
    do tipo: %s", errno, strerror(errno));

    printf("Criando a tela de erro...\n");
    construtor = gtk_builder_new_from_file("tela_erro.glade");

    if(construtor==NULL)
    {
        printf("Erro! Erro n %i, do tipo: %s", errno, strerror(errno));
        return FALSE;
    }

    printf("Alocando os dados da tela de erro...\n");
    modelo_estrutura_erro->label_erro = GTK_LABEL(gtk_builder_get_object(construtor, 
    "label_erro"));

    if(modelo_estrutura_erro->label_erro==NULL){printf("Erro ao alocar a 
    estrutura!\n");return FALSE;}

    criar_widget(modelo_estrutura_erro->janela_erro, construtor,"janela_erro");
    criar_widget(modelo_estrutura_erro->box_erro, construtor,"box_erro");
    criar_widget(modelo_estrutura_erro->botao_erro, construtor,"botao_erro");
    printf("Inicializando os sinais da tela de erro...\n");
    g_signal_connect(GTK_WIDGET(modelo_estrutura_erro->botao_erro), "clicked", G_CALLBACK(gtk_main_quit),NULL);

    printf("Alocando a mensagem na tela de erro...\n");
    gtk_label_set_text(modelo_estrutura_erro->label_erro, modelo_estrutura_erro-                
    >string_erro);

    printf("Mostrando a janela de erro...\n");
    gtk_widget_show(modelo_estrutura_erro->janela_erro);

    g_object_unref(construtor);
    return TRUE;
}

字符串

dgiusagp

dgiusagp1#

这是错误的:

construtor = malloc(sizeof construtor);

字符串
1.您需要为sizeof *constructor保留空间,而不是sizeof constructor,否则您将为指针保留空间。
1.替换此行中malloc保留的空间(内存泄漏):

construtor = gtk_builder_new_from_file("tela_erro.glade");


删除malloc行(相关:当使用GTK/GLIB时,总是首选安全版本g_malloc
关于您的问题:

g_signal_connect(GTK_WIDGET(modelo_estrutura_erro->botao_erro), "clicked", G_CALLBACK(gtk_main_quit),NULL);


"clicked"事件与一个有效的示例连接起来,clicked需要一个对象(而不是一个通用的小部件)作为父对象。
GTK_WIDGET(modelo_estrutura_erro->botao_erro)替换为G_OBJECT(modelo_estrutura_erro->botao_erro)

6ovsh4lw

6ovsh4lw2#

感谢上面的答案,我能够纠正代码,现在可以轻松地工作,即使有多个窗口示例。

int mensagem_erro()
{
    GtkBuilder *construtor = NULL;

    printf("Criando a tela de erro...\n");
    construtor = gtk_builder_new_from_file("tela_erro.glade");

    if(construtor==NULL)
    {
        printf("Erro! Erro n %i, do tipo: %s", errno, strerror(errno));
        return FALSE;
    }

    printf("Alocando a janela...\n");
    modelo_estrutura_erro = g_malloc(sizeof(*modelo_estrutura_erro));
    modelo_estrutura_erro->string_erro = (char*) g_malloc(sizeof(char[TAMANHO_STRING_ERRO]));

    printf("Gerando a mensagem de erro...\n");
    snprintf(modelo_estrutura_erro->string_erro, TAMANHO_STRING_ERRO-1,"Erro! Erro n %i, do tipo: %s", errno, strerror(errno));

    printf("Alocando os dados da tela de erro...\n");
    modelo_estrutura_erro->label_erro = GTK_LABEL(gtk_builder_get_object(construtor, "label_erro"));

    if(modelo_estrutura_erro->label_erro==NULL){printf("Erro ao alocar a estrutura!\n");return FALSE;}

    modelo_estrutura_erro->janela_erro = criar_widget(modelo_estrutura_erro->janela_erro, construtor,"janela_erro");
    modelo_estrutura_erro->box_erro = criar_widget(modelo_estrutura_erro->box_erro, construtor,"box_erro");
    modelo_estrutura_erro->botao_erro = criar_widget(modelo_estrutura_erro->botao_erro, construtor,"botao_erro");
    printf("Inicializando os sinais da tela de erro...\n");

    //O tipo de sinal clicked necessita de um objeto como parente para funcionar
    g_signal_connect(G_OBJECT(modelo_estrutura_erro->botao_erro), "clicked", G_CALLBACK(gtk_main_quit),NULL);

    printf("Alocando a mensagem na tela de erro...\n");
    gtk_label_set_text(modelo_estrutura_erro->label_erro, modelo_estrutura_erro->string_erro);

    printf("Mostrando a janela de erro...\n");
    gtk_widget_show(modelo_estrutura_erro->janela_erro);

    g_object_unref(construtor);
    return TRUE;
}

字符串

相关问题