2014-12-08 12 views
3

두 개의 열이있는 표가있는 간단한 대화 상자가 있습니다. 그 중 하나는 확인란입니다. GtkCellRendererToggle을 추가했지만 클릭 할 수 없습니다. 나는 결코 호출되지 않는 onToggle 함수를 추가했다. 셀 렌더러를 활성화 할 수 있으며 두 번째로 C 코드에서 안전면이 활성화되도록 호출을 추가했지만 아무 도움이되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 다음은 코드입니다 :트리보기에서 확인란을 전환 할 수 없습니다.

void 
on_button_delete_files_click (GtkTreeSelection * widget, gpointer user_data) 
{ 
    GtkDialog * dialog = NULL; 
    GtkWidget * file_choser; 
    char   * msg = NULL; 
    GtkListStore * liststore = NULL; 
    GtkTreeIter  iter; 
    GDir   * dir = NULL; 
    char   * filename = NULL; 

    if (!builder_delete_files_dialog) { 
     GError * error = NULL; 
     builder_delete_files_dialog = gtk_builder_new(); 
     if (!gtk_builder_add_from_file (builder_delete_files_dialog, "deletedlg.glade", &error)) { 
      g_warning ("%s", error->message); 
      g_free (error); 
      exit (1); 
     } 
    } 

    // 
    // Get list store 
    // 
    liststore = GTK_LIST_STORE (gtk_builder_get_object (builder_delete_files_dialog, "podcast_file_liststore")); 
    //gtk_list_store_clear (liststore); 

    // 
    // Add all files 
    // 
    dir = g_dir_open (download_directory, 0, NULL); 
    if (NULL == dir) { 

    } 

    while (NULL != (filename = g_dir_read_name (dir))) { 
     if (NULL == g_strrstr (filename, ".mp3")) 
      continue; 

     gtk_list_store_append(liststore, &iter); 
     gtk_list_store_set (liststore, &iter, 
           TO_BE_DELETED, FALSE, 
           FILENAME, filename, 
           -1); 
    } 
    // 
    // nice try since stuff is not activatable 
    // 

    GtkCellRendererToggle * toggle = GTK_CELL_RENDERER_TOGGLE(gtk_builder_get_object (builder_delete_files_dialog, "cellrenderertoggle1")); 
    gtk_cell_renderer_toggle_set_activatable (toggle, TRUE); 

    dialog = GTK_WIDGET(gtk_builder_get_object (builder_delete_files_dialog, "dialog_delete_files")); 

    int rc = gtk_dialog_run (GTK_DIALOG(dialog)); 
    switch (rc) { 
    case GTK_RESPONSE_OK: 
    case GTK_RESPONSE_CANCEL: 
    default: 
     break; 
    } 

    gtk_widget_hide (dialog); 

__error: 
    FREE_POINTER(g_dir_close, dir); 
} 

void on_toggle_renderer_click (GtkCellRendererToggle * cell, char * tree_path, gpointer data) 
{ 
    g_print ("=====> Dingens clicked !!! <=====\n"); 
    GtkTreeModel *model = (GtkTreeModel *)data; 
    GtkTreeIter iter; 
    GtkTreePath *path = gtk_tree_path_new_from_string (tree_path); 
    gboolean fixed; 

    /* get toggled iter */ 
    gtk_tree_model_get_iter (model, &iter, path); 
    gtk_tree_model_get (model, &iter, TO_BE_DELETED, &fixed, -1); 

    /* do something with the value */ 
    fixed ^= 1; 

    /* set new value */ 
    gtk_list_store_set (GTK_LIST_STORE (model), &iter, TO_BE_DELETED, fixed, -1); 

    /* clean up */ 
    gtk_tree_path_free (path); 
} 

그리고 여기에 XML 파일이다 : 다시

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.16.1 --> 
<interface> 
    <requires lib="gtk+" version="3.10"/> 
    <object class="GtkImage" id="imageApply"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <property name="stock">gtk-apply</property> 
    </object> 
    <object class="GtkImage" id="imageDelete"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <property name="stock">gtk-delete</property> 
    </object> 
    <object class="GtkListStore" id="podcast_file_liststore"> 
    <columns> 
     <!-- column-name TO_BE_DELETED --> 
     <column type="gboolean"/> 
     <!-- column-name FILENAME --> 
     <column type="gchararray"/> 
     <!-- column-name < --> 
     <column type="&lt; Neue Spalte definieren &gt;"/> 
    </columns> 
    </object> 
    <object class="GtkDialog" id="dialog_delete_files"> 
    <property name="width_request">320</property> 
    <property name="height_request">300</property> 
    <property name="can_focus">False</property> 
    <property name="resizable">False</property> 
    <property name="type_hint">dialog</property> 
    <child internal-child="vbox"> 
     <object class="GtkBox" id="dialog-vbox1"> 
     <property name="can_focus">False</property> 
     <property name="orientation">vertical</property> 
     <property name="spacing">2</property> 
     <child internal-child="action_area"> 
      <object class="GtkButtonBox" id="dialog-action_area1"> 
      <property name="can_focus">False</property> 
      <property name="layout_style">end</property> 
      <child> 
       <object class="GtkButton" id="btnDelete"> 
       <property name="label" translatable="yes">Delete Selected</property> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="receives_default">True</property> 
       <property name="image">imageDelete</property> 
       <property name="always_show_image">True</property> 
       </object> 
       <packing> 
       <property name="expand">False</property> 
       <property name="fill">True</property> 
       <property name="position">0</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkButton" id="btnClose"> 
       <property name="label" translatable="yes">Close</property> 
       <property name="name">btnClose</property> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="receives_default">True</property> 
       <property name="image">imageApply</property> 
       <property name="always_show_image">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="pack_type">end</property> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     <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="file_treeview"> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="vexpand">True</property> 
       <property name="model">podcast_file_liststore</property> 
       <child internal-child="selection"> 
        <object class="GtkTreeSelection" id="treeview-selection2"/> 
       </child> 
       <child> 
        <object class="GtkTreeViewColumn" id="treeviewcolumn1"> 
        <property name="title" translatable="yes">Delete</property> 
        <child> 
         <object class="GtkCellRendererToggle" id="cellrenderertoggle1"> 
         <signal name="toggled" handler="on_toggle_renderer_click" object="podcast_file_liststore" swapped="no"/> 
         </object> 
         <attributes> 
         <attribute name="active">0</attribute> 
         </attributes> 
        </child> 
        </object> 
       </child> 
       <child> 
        <object class="GtkTreeViewColumn" id="treeviewcolumn2"> 
        <property name="title" translatable="yes">File name</property> 
        <child> 
         <object class="GtkCellRendererText" id="cellrenderertext1"/> 
         <attributes> 
         <attribute name="text">1</attribute> 
         </attributes> 
        </child> 
        </object> 
       </child> 
       </object> 
      </child> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    <action-widgets> 
     <action-widget response="-5">btnDelete</action-widget> 
     <action-widget response="-6">btnClose</action-widget> 
    </action-widgets> 
    </object> 
</interface> 

: 나는 체크 박스를 클릭하면 onToggle - 이벤트 핸들러가 호출되지 않습니다. 이것은 세포가 어떻게 든 활발하지 않다고 생각하게 만듭니다.

모든 힌트에 대해 많은 감사드립니다. Greets 카이

+0

혹시 이것에 대한 답변을 찾으셨습니까? 나는 같은 문제에 직면하고있다 ... – alexmurray

+0

아니, 실제로. 내 의혹은 이것이 버그라는 것입니다. 하지만 C에서 glade와 GTK는 파이썬에 비해 매우 대중적이지 않은 것 같습니다 .... – kaidentity

+0

GtkCellRendererToggle을 '활성화 가능'하게 만들어서 - 즉 값이 '활성화 가능'인 속성을 추가합니다. – alexmurray

답변

0

GtkCellRendererToggle을 '활성화 가능'으로 설정하여 작동 시켰습니다. 즉, '활성화 가능'속성을 값 True로 추가했습니다. - alexmurray