【问题标题】:How to place multiple selected files in the dialog_choose a gtk_tree_view如何在对话框中放置多个选定的文件_选择一个 gtk_tree_view
【发布时间】:2017-08-16 21:52:44
【问题描述】:

此代码从 dialogo_chosser 中获取一个文件并添加到 gtk_tree_view... 我会从一个 gtkfilechosser 中获取更多文件并将它们添加到 gtk_tree_view... 我看到你必须输入这个函数:

gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE)

但我不知道如何获取所选文件 :( 我“礼貌地”问这个解决方案的一个小例子

我的代码是:

#include "header.h"
#include <string.h>
#include <gtk/gtk.h>

GtkWidget *list;
GtkWidget *win;
char *filename;

void Add_Items_List(GtkWidget *widget, gpointer data)
{
  GtkListStore *store;
  GtkTreeIter iter;

  store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));

  gtk_list_store_append(store, &iter);

  gtk_list_store_set(store, &iter, 0, filename, -1);

}

void Dialog_Chooser(GtkWidget *widget, gpointer gst)
{
  GtkWidget *dialog;
  GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
  GtkFileChooser *chooser;
  gint res;

  dialog = gtk_file_chooser_dialog_new("Open File", GTK_WINDOW(win), action,
                       "Cancel", GTK_RESPONSE_CANCEL,
                       "Open", GTK_RESPONSE_ACCEPT, NULL);

  res = gtk_dialog_run(GTK_DIALOG(dialog));

  if(res == GTK_RESPONSE_ACCEPT){
    chooser = GTK_FILE_CHOOSER(dialog);

    filename = gtk_file_chooser_get_filename(chooser);

    Add_Items_List(NULL, NULL);

    g_free(filename);
  }

  gtk_widget_destroy(dialog);
}

void Delete_Item_List(GtkWidget *widget, gpointer selection)
{
  GtkTreeModel *model;
  GtkTreeIter iter;

  model = gtk_tree_view_get_model(GTK_TREE_VIEW(list));

  if(gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter)){
    gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
  }

}

void Delete_All_Items_List(GtkWidget *widget, gpointer selection)
{
  GtkListStore *store;
  GtkTreeIter iter;

  store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));

  gtk_list_store_clear(store);
}

void Inizializes_The_List(GtkWidget *list)
{
  GtkCellRenderer *renderer;
  GtkTreeViewColumn *column;
  GtkListStore *store;

  renderer = gtk_cell_renderer_text_new();

  column = gtk_tree_view_column_new_with_attributes("Lenguages", renderer, "text", 0, NULL);
  gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);

  store = gtk_list_store_new(1, G_TYPE_STRING);

  gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));

  g_object_unref(store);
}

void Add_Lista(GtkWidget *list, const gchar *str)
{
  GtkListStore *store;
  GtkTreeIter iter;

  store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));

  gtk_list_store_append(store, &iter);

  gtk_list_store_set(store, &iter, 0, str, -1);
}

int main(int argc, char **argv)
{
  GtkWidget *Button_remove;
  GtkWidget *button_remove_all;
  GtkWidget *button_chosser;
  GtkWidget *sw;
  GtkWidget *hbox;
  GtkWidget *vbox;
  GtkTreeSelection *selection;

  gtk_init(&argc, &argv);

  win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(win), "Simple chosser list");
  gtk_window_set_default_size(GTK_WINDOW(win), 200, 200);
  gtk_container_set_border_width(GTK_CONTAINER(win), 10);

  sw = gtk_scrolled_window_new(NULL, NULL);

  list = gtk_tree_view_new();

  gtk_container_add(GTK_CONTAINER(sw), list);

  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);

  gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE);

  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 5);

  hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);

  Button_remove = gtk_button_new_with_label("Delete");
  button_remove_all = gtk_button_new_with_label("Delte All");
  button_chosser = gtk_button_new_with_label("List");

  gtk_box_pack_start(GTK_BOX(hbox), Button_remove, FALSE, TRUE, 3);
  gtk_box_pack_start(GTK_BOX(hbox), button_remove_all, FALSE, TRUE, 3);
  gtk_box_pack_start(GTK_BOX(hbox), button_chosser, FALSE, TRUE, 3);
  gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 3);

  gtk_container_add(GTK_CONTAINER(win), vbox);

  Inizializes_The_List(list);

  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));

  g_signal_connect(G_OBJECT(button_chosser), "clicked", G_CALLBACK(Dialog_Chooser), NULL);
  g_signal_connect(Button_remove, "clicked", G_CALLBACK(Delete_Item_List), selection);
  g_signal_connect(button_remove_all, "clicked", G_CALLBACK(Delete_All_Items_List), selection);

  g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(destroy), NULL);

  gtk_widget_show_all(win);

  gtk_main();

  return 0;
}

ps:在 ubuntu 16.04 上使用 gtk+3

【问题讨论】:

    标签: gtk3


    【解决方案1】:

    目前,我找到了这个解决方案:

    void Dialog_Chooser(GtkWidget *widget, gpointer gst)
    {
      GtkWidget *dialog;
      GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
      GtkFileChooser *chooser;
      gint res;
    
      dialog = gtk_file_chooser_dialog_new("Open File", GTK_WINDOW(win), action, "Cancel",
                                           GTK_RESPONSE_CANCEL, "Open", GTK_RESPONSE_ACCEPT, NULL);
    
      gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
    
      res = gtk_dialog_run(GTK_DIALOG(dialog));
    
      if(res == GTK_RESPONSE_ACCEPT){
        GSList *filenamepus;
    
        chooser = GTK_FILE_CHOOSER(dialog);
    
        //filename = gtk_file_chooser_get_filename(chooser);
        filenamepus = gtk_file_chooser_get_filenames(chooser);
    
        int    nIndex;
        GSList *node;
    
        for(nIndex = 0; node = g_slist_nth(filenamepus, nIndex); nIndex++){
          filename = (char *) node->data; //g_slist_nth(filenamepus, nIndex);
          Add_Items_List(NULL, NULL);
          //g_print ("%s\n", filename); //(char *) node->data);
        }
    
        //Add_Items_List(NULL, NULL);
    
        g_free(filename);
      }
    
      gtk_widget_destroy(dialog);
    }
    

    如果有人知道更好的解决方案,我仍然很想听。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 2011-08-20
      • 2020-12-11
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多