Sinais na libglade [RESOLVIDO]

1. Sinais na libglade [RESOLVIDO]

samuel
samoliver1914

(usa Lubuntu)

Enviado em 25/04/2015 - 12:54h

Boa tarde, estou estutando gtk+ com o glade, e o programa que eu fis aparece a janela, mas nao conecta as funcoes callback.


#include <glade/glade.h> // Carrega os recursos do Glade
#include <gtk/gtk.h>


//Carrega os recursos do GTK
GladeXML * xml; //Cria um ponteiro para uma estrutura GladeXML


void fechar() //Fechar a aplicação
{
gtk_main_quit(); //Encerra o loop principal do GTK
}

void aplicar() //Exibe a mensagem definida
{
GtkWidget * mensagem; // Cria um ponteiro para o widget
mensagem = glade_xml_get_widget(xml,"label1"); //Associa owidget ao ponteiro
gtk_label_set_text(GTK_LABEL(mensagem),"Olá mundo!"); //Define otexto que será exibido no widget
}

void limpar()
{
GtkWidget * mensagem;
mensagem = glade_xml_get_widget(xml,"label1");
gtk_label_set_text(GTK_LABEL(mensagem),"");
}

int main(int argc,char *argv[])
//O Corpo principal do Programa
{
GtkWidget *window;
gtk_init(&argc,&argv);
//glade_init();
//Inicializa o GTK
//Inicializa o Glade – Isto geralmente é opcional
xml = glade_xml_new("hello.glade",NULL,NULL); //Lê o arquivo com aestrutura XML da sua aplicação
glade_xml_signal_autoconnect(xml); //Conecta todos os sinais aos seus manipuladores
window = glade_xml_get_widget(xml, "window1");

gtk_widget_show_all(window);

gtk_main(); // O Loop de eventos do GTK
return 0;
}


arquivo glade:

<?xml version="1.0" encoding="UTF-8"?>
<glade-interface>
<!-- interface-requires gtk+ 2.24 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Hello World</property>
<property name="resizable">False</property>
<property name="window_position">center</property>
<signal name="destroy" handler="gtk_main_quit"/>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<widget class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">[Apagar]</property>
</widget>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<widget class="GtkButton" id="button1">
<property name="label" translatable="yes">Aplicar</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="aplicar"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button2">
<property name="label" translatable="yes">Limpar</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="limpar"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button3">
<property name="label" translatable="yes">Sair</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="fechar"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>


o erro que aparece quando executo o programa:

sam@sam-STI:~/project$ ./hello

(hello:10593): libglade-WARNING **: could not find signal handler 'fechar'.

(hello:10593): libglade-WARNING **: could not find signal handler 'aplicar'.

(hello:10593): libglade-WARNING **: could not find signal handler 'limpar'.



  


2. MELHOR RESPOSTA

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 25/04/2015 - 15:27h

Fazer pelo próprio glade é meio complexo maninho, então eu deixei os Sinais configurados no .c mesmo.
Ah, e alterei o Arquivo Hello.glade, espero que goste =D

Main.c:


#include <gtk/gtk.h>

GtkBuilder *gb = NULL;
GtkWidget *msg = NULL;
GtkWidget *cxTexto = NULL;

void fechar(){
g_object_unref(gb);
gtk_main_quit();
}

void aplicar(){
gtk_label_set_text(GTK_LABEL(msg),
gtk_entry_get_text(GTK_ENTRY(cxTexto))
);
}

void limpar(){
gtk_label_set_text(GTK_LABEL(msg),"[ ]");
}

int main(int argc, char *argv[]){

gtk_init(&argc,&argv);

gb = gtk_builder_new();
gtk_builder_add_from_file(gb,"Hello.glade",NULL);

msg = GTK_WIDGET(gtk_builder_get_object(gb,"label"));

cxTexto = GTK_WIDGET(gtk_builder_get_object(gb,"cxTexto"));

GtkWidget *janela = GTK_WIDGET(gtk_builder_get_object(gb,"janela"));
gtk_signal_connect(GTK_OBJECT(janela),"destroy", G_CALLBACK(fechar),NULL);

GtkWidget *btnAplicar = GTK_WIDGET(gtk_builder_get_object(gb,"btnAplicar"));
gtk_signal_connect(GTK_OBJECT(btnAplicar),"clicked",G_CALLBACK(aplicar),NULL);

GtkWidget *btnLimpar = GTK_WIDGET(gtk_builder_get_object(gb,"btnLimpar"));
gtk_signal_connect(GTK_OBJECT(btnLimpar),"clicked",G_CALLBACK(limpar),NULL);

GtkWidget *btnSair = GTK_WIDGET(gtk_builder_get_object(gb,"btnSair"));
gtk_signal_connect(GTK_OBJECT(btnSair),"clicked",G_CALLBACK(fechar),NULL);


gtk_widget_show(janela);
gtk_main();
return 0;
}



Hello.glade:


<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="janela">
<property name="can_focus">False</property>
<property name="default_width">480</property>
<property name="default_height">340</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">[Texto Padrão]</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="btnAplicar">
<property name="label" translatable="yes">Aplicar</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnLimpar">
<property name="label" translatable="yes">Limpar</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnSair">
<property name="label" translatable="yes">Sair</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="cxTexto">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#9679;</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>



Espero ter ajudado

[]'s

T+

3. Re: Sinais na libglade

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/04/2015 - 13:18h

Que mal lhe pergunte, você está compilando o programa como C ou como C++?

Se for C++, há uma grande chance de o compilador tem mudado internamente o nome da função, como parte da política de name mangling do C++ (que é usada para permitir sobrecarga de funções). Nesse caso, a solução poderia ser declarar fechar() com o atribuito “extern "C"”, ou simplesmente compilar o programa em C, em vez de C++.

Se o programa já for nativamente em C, não sei dizer qual o problema.

Em tempo: tem um ”[code][/code]” no meio do nome da chamada à função gtk_widget_show_all() no código original do programa, e isso está desformatando o texto. Edite sua postagem original para remover esse bloco.


4. Sinais na libglade

samuel
samoliver1914

(usa Lubuntu)

Enviado em 25/04/2015 - 14:01h

Bom eu estva usando o g++ com o extern "C" nao estava pegando, ai eu mudei para gcc para ver se era isso, e nao adianto nada.



5. Sinais na libglade

samuel
samoliver1914

(usa Lubuntu)

Enviado em 25/04/2015 - 17:44h

Valeu Thihup, pelo trabalhao de fica tentado faser o meu programa fusiona, o gtk_builder e bem melhor, ajudo bastante!


6. Re: Sinais na libglade

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 25/04/2015 - 17:52h

Desculpe por ter alterado o .glade, mas acho que ficou melhor desse jeito.
Modificar os sinais pelo Glade é meio complexo.
Desculpe qualquer coisa.

Marque o tópico como resolvido e escolha a melhor resposta.

Espero ter ajudado

[]'s

T+






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts