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="< Neue Spalte definieren >"/>
</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 카이
혹시 이것에 대한 답변을 찾으셨습니까? 나는 같은 문제에 직면하고있다 ... – alexmurray
아니, 실제로. 내 의혹은 이것이 버그라는 것입니다. 하지만 C에서 glade와 GTK는 파이썬에 비해 매우 대중적이지 않은 것 같습니다 .... – kaidentity
GtkCellRendererToggle을 '활성화 가능'하게 만들어서 - 즉 값이 '활성화 가능'인 속성을 추가합니다. – alexmurray