2017-12-25 7 views
0

현재 GTK와 Glade를 배우고 있습니다. 나는 작은 회계 프로그램을 만들기 위해 조금씩 노력하고있다. 지금, 나는 이상한 segfault가 일어난다. 그리고 나는 이유를 해석 할 수 없다. gtk_tree_selection_unselect_all을 사용하여 모든 GtkTreeSelection의 선택을 취소하고 싶습니다. 모두 선택하려고하면 충돌이 발생합니다.GTK Glade C - Treeview 선택 이상한 segfault

이상한 점은 on_treeview_selection1_changed 함수를 주석 처리하면 segfault가 발생하지 않는다는 것입니다. 그래서이 함수가 어떻게 든 다른 하나를 망쳐 놓은 것처럼 보입니다. 가능합니까?

을 main.c :

#include <gtk/gtk.h> 

typedef struct { 
    GtkTreeView *treeview; 
    GtkWidget *ent_date; 
    GtkWidget *ent_lib; 
    GtkWidget *ent_mont; 
    GtkWidget *but_unset; 
} app_widgets; 

enum 
{ 
    DATE_COLUMN, 
    LIBELLE_COLUMN, 
    MONTANT_COLUMN, 
    N_COLUMN 
}; 

void on_window_main_destroy() { 
    gtk_main_quit(); 
} 

void on_button_unset_clicked (GtkButton *button, app_widgets *app_wid) { 

    GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(app_wid->treeview)); 

    gtk_tree_selection_unselect_all(selection); 
    //gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); 
    //gtk_tree_selection_select_all(selection); 

} 

void on_treeview_selection1_changed (GtkTreeSelection *treeselection, app_widgets *app_wid) { 

    gchar *a,*b,*c; 
    GtkTreeIter iter; 
    GtkTreeModel *model; 

    if (gtk_tree_selection_get_selected(treeselection, &model, &iter)) 
    { 
     gtk_tree_model_get(model, &iter, DATE_COLUMN, &a, LIBELLE_COLUMN, &b,MONTANT_COLUMN, &c, -1); 

    } 

    gtk_entry_set_text(GTK_ENTRY(app_wid->ent_date), a); 
    gtk_entry_set_text(GTK_ENTRY(app_wid->ent_lib), b); 
    gtk_entry_set_text(GTK_ENTRY(app_wid->ent_mont), c); 

    g_free(a); 
    g_free(b); 
    g_free(c); 

} 

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

    app_widgets *widgets = g_slice_new(app_widgets); 

    gtk_init(&argc, &argv); 

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

    widgets->treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview1")); 
    widgets->ent_date = GTK_WIDGET(gtk_builder_get_object(builder, "entry_date")); 
    widgets->ent_lib = GTK_WIDGET(gtk_builder_get_object(builder, "entry_lib")); 
    widgets->ent_mont = GTK_WIDGET(gtk_builder_get_object(builder, "entry_mont")); 
    widgets->but_unset = GTK_WIDGET(gtk_builder_get_object(builder, "button_unset")); 

    gtk_builder_connect_signals(builder, widgets); 

    gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(builder, "window1"))); 

    g_object_unref(builder); 

    gtk_main(); 

    g_slice_free(app_widgets, widgets); 
    return 0; 
} 

과 test.glade 파일 : 당신은 현재 선택 영역이 없기 때문에 경우에도 gtk_tree_selection_get_selected(treeselection, &model, &iter)이 FALSE 반환 된 항목의 필드를 설정하려고 on_treeview_selection1_changed()에서

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.18.3 --> 
<interface> 
    <requires lib="gtk+" version="3.12"/> 
    <object class="GtkListStore" id="liststore1"> 
    <columns> 
     <!-- column-name Date --> 
     <column type="gchararray"/> 
     <!-- column-name Libellé --> 
     <column type="gchararray"/> 
     <!-- column-name Montant --> 
     <column type="gchararray"/> 
    </columns> 
    <data> 
     <row> 
     <col id="0" translatable="yes">20.05.2017</col> 
     <col id="1" translatable="yes">Something - here</col> 
     <col id="2" translatable="yes">30.20</col> 
     </row> 
     <row> 
     <col id="0" translatable="yes">25.06.2017</col> 
     <col id="1" translatable="yes">Something else - overthere</col> 
     <col id="2" translatable="yes">24.90</col> 
     </row> 
     <row> 
     <col id="0" translatable="yes">11.08.2017</col> 
     <col id="1" translatable="yes">Third thing - lala</col> 
     <col id="2" translatable="yes">5.15</col> 
     </row> 
    </data> 
    </object> 
    <object class="GtkWindow" id="window1"> 
    <property name="can_focus">False</property> 
    <property name="margin_left">5</property> 
    <property name="margin_right">5</property> 
    <property name="margin_top">5</property> 
    <property name="margin_bottom">5</property> 
    <property name="window_position">center</property> 
    <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="GtkScrolledWindow" id="scrolledwindow1"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="shadow_type">in</property> 
      <child> 
       <object class="GtkTreeView" id="treeview1"> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="model">liststore1</property> 
       <child internal-child="selection"> 
        <object class="GtkTreeSelection" id="treeview-selection1"> 
        <signal name="changed" handler="on_treeview_selection1_changed" swapped="no"/> 
       </object> 
       </child> 
       <child> 
        <object class="GtkTreeViewColumn" id="treeviewcolumn1"> 
        <property name="resizable">True</property> 
        <property name="fixed_width">70</property> 
        <property name="title" translatable="yes">Date</property> 
        <child> 
         <object class="GtkCellRendererText" id="cellrenderertext1"/> 
         <attributes> 
         <attribute name="text">0</attribute> 
         </attributes> 
        </child> 
        </object> 
       </child> 
       <child> 
        <object class="GtkTreeViewColumn" id="treeviewcolumn2"> 
        <property name="resizable">True</property> 
        <property name="title" translatable="yes">What</property> 
        <child> 
         <object class="GtkCellRendererText" id="cellrenderertext2"/> 
         <attributes> 
         <attribute name="text">1</attribute> 
         </attributes> 
        </child> 
        </object> 
       </child> 
       <child> 
        <object class="GtkTreeViewColumn" id="treeviewcolumn3"> 
        <property name="resizable">True</property> 
        <property name="title" translatable="yes">Amount</property> 
        <child> 
         <object class="GtkCellRendererText" id="cellrenderertext3"/> 
         <attributes> 
         <attribute name="text">2</attribute> 
         </attributes> 
        </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="GtkBox" id="box2"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <child> 
       <object class="GtkBox" id="box_date"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="orientation">vertical</property> 
       <child> 
        <object class="GtkLabel" id="label1"> 
        <property name="visible">True</property> 
        <property name="can_focus">False</property> 
        <property name="label" translatable="yes">Date</property> 
        </object> 
       <packing> 
        <property name="expand">False</property> 
        <property name="fill">True</property> 
        <property name="position">0</property> 
        </packing> 
       </child> 
       <child> 
        <object class="GtkEntry" id="entry_date"> 
        <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">1</property> 
        </packing> 
       </child> 
       </object> 
       <packing> 
       <property name="expand">False</property> 
       <property name="fill">True</property> 
       <property name="position">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkBox" id="box_lib"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="orientation">vertical</property> 
      <child> 
       <object class="GtkLabel" id="label2"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">What</property> 
       </object> 
       <packing> 
       <property name="expand">False</property> 
       <property name="fill">True</property> 
       <property name="position">0</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkEntry" id="entry_lib"> 
       <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">1</property> 
       </packing> 
      </child> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkBox" id="box_mont"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="orientation">vertical</property> 
      <child> 
       <object class="GtkLabel" id="label3"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">Amount</property> 
       </object> 
       <packing> 
       <property name="expand">False</property> 
       <property name="fill">True</property> 
       <property name="position">0</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkEntry" id="entry_mont"> 
       <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">1</property> 
       </packing> 
      </child> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">2</property> 
      </packing> 
     </child> 
     </object> 
     <packing> 
     <property name="expand">False</property> 
     <property name="fill">True</property> 
     <property name="position">1</property> 
     </packing> 
    </child> 
    <child> 
     <object class="GtkFixed" id="fixed1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkButton" id="button_unset"> 
      <property name="label" translatable="yes">Unselect</property> 
      <property name="width_request">100</property> 
      <property name="height_request">23</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <property name="xalign">0.47999998927116394</property> 
      <property name="yalign">0.44999998807907104</property> 
      <signal name="clicked" handler="on_button_unset_clicked" swapped="no"/> 
      </object> 
      <packing> 
      <property name="x">370</property> 
      <property name="y">68</property> 
      </packing> 
     </child> 
     </object> 
     <packing> 
     <property name="expand">False</property> 
     <property name="fill">True</property> 
     <property name="position">2</property> 
     </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

답변

0

. 이 경우 변수 a, b 및 c는 gtk_tree_model_get(model, &iter, DATE_COLUMN, &a, LIBELLE_COLUMN, &b,MONTANT_COLUMN, &c, -1)으로 설정되지 않았으므로 세 개의 gtk_entry_set_text 명령어를 호출하면 세그 폴트가 발생합니다 (동일한 이유로 g_free 명령어도 작동하지 않음). A, B 및 C는 임의의 값이 아닌 문자열을 가리켜 야합니다.

선택 필드가없는 경우 입력 필드의 내용을 삭제하려면 gtk_entry_set_text(GTK_ENTRY(app_wid->ent_date), ""); 등을 사용하는 것이 좋습니다.

+0

감사합니다. 나는 그것을 보았어 야했다. 나는'if' 안에 a, b, c 변수 선언, 효과 및 해방을 넣었습니다. –

관련 문제