2011-04-28 38 views
0

我要複製通過GtkBuilder加載的GtkWidget重複的GtkWidget用C

我的問題是,告訴GTK來它裝入同一VBOX它已經在導致一個錯誤,我不知道如何複製它。我想它涉及到指針和引用的混亂,這可能是爲什麼我錯過了這一點。

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); 

     }}} 

這填充了窗口部件的窗口與分隔符之間的5次。問題在於該程序打開和關閉相同的文件5次以上才能實現。

如何將構建器輸出和「複製」到5個完全不同的實例中?它可能涉及很多* s和& s。

回答

2

無論您使用多少個指針,您都無法「複製」窗口小部件。您在上例中的做法是正確的。一個改進之處在於你可以將小部件移動到它自己的小型生成器文件中。如果小部件很小,您可以考慮製作您自己的小部件類並手動構建它,而不是從構建器文件構建它。

PS。如果你想用C編寫一個應用程序,你最好學會不要害怕指針!

+0

它已經在它自己的小文件中,但是說較小的文件超過了11kb ... – 2011-04-29 09:18:07

+0

好吧,如果你可以複製它,它將涉及爲每個小部件實例重新構造所有的子小部件。除非你真的注意到一個重大的性能問題,否則我不會擔心五次讀取文件。不要浪費時間來優化不需要優化的東西。 – ptomato 2011-04-29 09:50:52