2011-04-28 2 views
0

Je veux dupliquer un GtkWidget chargé par GtkBuilderen double GtkWidgetdans C

Mon problème est que dire Gtk pour emballer dans le même Vbox il est déjà fait une erreur, et je ne sais pas comment dupliquer . J'imagine que cela implique de jouer avec des pointeurs et des références, ce qui est probablement la raison pour laquelle je manque le point.

static GtkWidget *my_widget(){ 

     GtkBuilder    *builder; 

     builder = gtk_builder_new(); 
     gtk_builder_add_from_file (builder, "widget.glade", NULL);  
     return GTK_WIDGET (gtk_builder_get_object (builder, "widget")); 
} 

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

     gtk_init (&argc, &argv); 

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

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

     // Load widget into box 
     int i; 
     for (i=0; i<5; i++){ 
      gtk_box_pack_start(GTK_BOX (gtk_builder_get_object (builder, "widget_vbox")), 
           my_widget(), 
           FALSE, 
           TRUE, 
           0); 

      if(i!=4){ // Don't add a seperator at the last loop 
       widget = gtk_hseparator_new(); 
       gtk_box_pack_start(GTK_BOX (gtk_builder_get_object (builder, "solo_mission_vbox")), 
            widget, 
            FALSE, 
            TRUE, 
            0); 
       gtk_widget_show(widget); 

     }}} 

Ceci remplit la boîte avec le widget 5 fois avec des séparateurs entre les deux. Le problème réside dans le fait que le programme ouvre et ferme 5 fois le même fichier juste pour le mettre en place.

Comment puis-je prendre la sortie du générateur et la "copier" dans 5 instances complètement différentes? Il implique probablement quelque chose avec beaucoup de * s et & s.

Répondre

2

Vous ne pouvez pas "copier" des widgets, quel que soit le nombre de pointeurs que vous utilisez. La façon dont vous le faites dans votre exemple ci-dessus est correcte. Une amélioration est que vous pouvez déplacer le widget dans son propre fichier de construction plus petit. Si le widget est petit, vous pouvez envisager de créer votre propre classe de widget et de le construire manuellement, plutôt que d'un fichier de générateur.

PS. Si vous voulez programmer une application en C, il vaut mieux apprendre à ne pas avoir peur des pointeurs!

+0

Il est déjà dans son propre fichier plus petit, mais dit fichier plus petit est plus de 11kb ... –

+0

Eh bien, si vous le copier, il faudrait reconstruire tous les sous-widgets pour chaque instance du widget. À moins que vous ne remarquiez un gros succès, je ne m'inquiéterais pas de lire le fichier cinq fois. Ne perdez pas votre temps à optimiser quelque chose qui n'a pas besoin d'optimisation. – ptomato