2016-01-15 1 views
-2

J'essaie d'apprendre le développement de Linux par curiosité avec peu de connaissance de C.Traitement du signal avec glade et GTK +

J'utilise glade 3.18.3.

Je veux créer une application dans laquelle le texte sur label1 sera modifié avec le texte d'entrée dans entry1 (zone de saisie) lorsque button1 sera pressé. Je ne sais pas comment passer les arguments nécessaires au rappel.

Je ne sais pas comment passer les arguments nécessaires au rappel.

Ceci est sample.glade:

<?xml version="1.0" encoding="UTF-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">Nishant</property> 
    <property name="default_width">440</property> 
    <property name="default_height">250</property> 
    <signal name="destroy" handler="on_window_main_destroy" swapped="no"/> 
    <child> 
     <object class="GtkBox" id="box1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="orientation">vertical</property> 
     <child> 
      <object class="GtkMenuBar" id="menubar1"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <child> 
       <object class="GtkMenuItem" id="menuitem1"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">_File</property> 
       <property name="use_underline">True</property> 
       <child type="submenu"> 
        <object class="GtkMenu" id="menu1"> 
        <property name="visible">True</property> 
        <property name="can_focus">False</property> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem1"> 
         <property name="label">gtk-new</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem2"> 
         <property name="label">gtk-open</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem3"> 
         <property name="label">gtk-save</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem4"> 
         <property name="label">gtk-save-as</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        <child> 
         <object class="GtkSeparatorMenuItem" id="separatormenuitem1"> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         </object> 
        </child> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem5"> 
         <property name="label">gtk-quit</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        </object> 
       </child> 
       </object> 
      </child> 
      <child> 
       <object class="GtkMenuItem" id="menuitem2"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">_Edit</property> 
       <property name="use_underline">True</property> 
       <child type="submenu"> 
        <object class="GtkMenu" id="menu2"> 
        <property name="visible">True</property> 
        <property name="can_focus">False</property> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem6"> 
         <property name="label">gtk-cut</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem7"> 
         <property name="label">gtk-copy</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem8"> 
         <property name="label">gtk-paste</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem9"> 
         <property name="label">gtk-delete</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        </object> 
       </child> 
       </object> 
      </child> 
      <child> 
       <object class="GtkMenuItem" id="menuitem3"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">_View</property> 
       <property name="use_underline">True</property> 
       </object> 
      </child> 
      <child> 
       <object class="GtkMenuItem" id="menuitem4"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">_Help</property> 
       <property name="use_underline">True</property> 
       <child type="submenu"> 
        <object class="GtkMenu" id="menu3"> 
        <property name="visible">True</property> 
        <property name="can_focus">False</property> 
        <child> 
         <object class="GtkImageMenuItem" id="imagemenuitem10"> 
         <property name="label">gtk-about</property> 
         <property name="visible">True</property> 
         <property name="can_focus">False</property> 
         <property name="use_underline">True</property> 
         <property name="use_stock">True</property> 
         </object> 
        </child> 
        </object> 
       </child> 
       </object> 
      </child> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label1"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">label1</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkEntry" id="entry1"> 
      <property name="name">entry1</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">2</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="button1"> 
      <property name="label" translatable="yes">button1</property> 
      <property name="name">button1</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <property name="halign">center</property> 
      <signal name="activate" handler="on_button1_activate" swapped="no"/> 
      <signal name="clicked" handler="on_button1_clicked" swapped="no"/> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">3</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkStatusbar" id="statusbar1"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="margin_left">10</property> 
      <property name="margin_right">10</property> 
      <property name="margin_start">10</property> 
      <property name="margin_end">10</property> 
      <property name="margin_top">6</property> 
      <property name="margin_bottom">6</property> 
      <property name="orientation">vertical</property> 
      <property name="spacing">2</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">4</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

... et c'est main.c:

// ## gcc -o gladewin main.c -Wall pkg-config --cflags --libs gtk+-3.0 -export dynamique

#include <gtk/gtk.h> 
#include <stdio.h> 
//gchar *buffer1; //added 
int main(int argc, char *argv[]) 
{ 
    GtkBuilder  *builder; 
    GtkWidget  *window; 
    // ## gchar BUFF[100]; 


    gtk_init(&argc, &argv); 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file (builder, "sample.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; 
} 

// called when window is closed 
void on_window_main_destroy() 
{ 
    gtk_main_quit(); 
} 



//called when button1 is clicked 
void on_button1_clicked() 
{ 
//buffer1 = gtk_entry_get_buffer (entry); 
//gtk_entry_buffer_get_text (buffer1); 

g_print("Button1 pressed"); 

//gtk_button_set_label (button1 ,"Hi"); 
//gtk_label_set_text(GTK_LABEL(entry1),"hi"); // i think this is correct just need tofigure out what to replace insted of entry1 
} 
+0

Quoi? le préprocesseur C? De plus, il n'y a pas de C++ dans votre code. –

+0

monsieur, j'utilise Fedora 22 pour tester ce code. Je peux compiler sussessfully ci-dessus le code en utilisant >> gcc -o gladewin main.c -Wall 'pkg-config --cflags --libs gtk + -3.0' -export-dynamique –

+0

S'il vous plaît fournir un lien vers la langue C/C++. Jusque-là: C et C++ sont des langues différentes. Notez que "CPP" est le préprocesseur C. Il est peu probable que vous vouliez dire ça! – Olaf

Répondre

0

Les rappels de signaux reçoivent des arguments spécifiques en fonction du type de signal intercepté. La signature de chaque rappel est documented par la documentation officielle. En clairière, lors de la définition d'un signal, vous pouvez passer un widget supplémentaire au rappel de signal. Le vrai défi est que vous pouvez passer seulement un widget un, alors que vous devez avoir accès à tous les deux (l'étiquette et l'entrée).

En langage C, vous allez insérer les deux pointeurs dans une structure et l'utiliser à la place, mais si vous voulez utiliser glade, vous devez trouver une autre solution. Une façon pourrait être d'utiliser deux callbacks, .: par exemple

Glade screenshot

Alors votre callbacks pourrait être:

void read_from_entry(GtkButton *button, gpointer user_data) 
{ 
    GtkEntry *entry = GTK_ENTRY(user_data); 

    g_print("read_from_entry\n"); 

    g_object_set_data(G_OBJECT(button), "text", (gpointer) gtk_entry_get_text(entry)); 
} 

void write_to_label(GtkButton *button, gpointer user_data) 
{ 
    GtkLabel *label = GTK_LABEL(user_data); 

    g_print("write_to_label\n"); 

    gtk_label_set_text(label, g_object_get_data(G_OBJECT(button), "text")); 
} 

La paire g_object_{set,get}_data est utilisé juste pour éviter d'utiliser une approche globale.Ce qui précède fonctionnera de manière fiable à condition que:

  1. l'ordre de rappel est conservé;
  2. n'écrit pas à l'entrée dans ou entre les deux rappels.
0

Votre méthode pour acquérir le texte de GtkEntry est bizarre. Vous n'avez pas besoin de jouer avec des tampons du tout; il suffit de faire

const char *text = gtk_entry_get_text(myEntry); 

Le tampon retourné par text vous donne le texte complet, mais comme une chaîne de lecture seule qui est libérée lorsque le GtkEntry veut.

Pour vos besoins, vous pouvez passer directement à gtk_button_set_label() et gtk_label_set_text():

gtk_button_set_label(button, text); 
gtk_label_set_text(label, text); 

Et en général, la valeur reste valable dans l'ensemble du gestionnaire de signal. Si vous souhaitez conserver le texte pour plus tard, vous devez le copier avec g_strdup() (gratuit avec g_free()).

De plus, gtk_label_set_text() ne fonctionne pas avec GtkEntry; vous devez utiliser un GtkLabel avec.