⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 gtk 开发的treeview功能演示
💻 C
字号:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

#include <config.h>

#include <gtk/gtk.h>
#include <glade/glade.h>

//#include <support.h>

/*
 * Standard gettext macros.
 */
#ifdef ENABLE_NLS
#  include <libintl.h>
#  undef _
#  define _(String) dgettext (PACKAGE, String)
#  ifdef gettext_noop
#    define N_(String) gettext_noop (String)
#  else
#    define N_(String) (String)
#  endif
#else
#  define textdomain(String) (String)
#  define gettext(String) (String)
#  define dgettext(Domain,Message) (Message)
#  define dcgettext(Domain,Message,Type) (Message)
#  define bindtextdomain(Domain,Directory) (Domain)
#  define _(String) (String)
#  define N_(String) (String)
#endif


#define GLADE_FILE "project1.glade"
#define PIX_FILE    "/home/bailey/gtk-demo/icon/Worried.png"

#define RC_FILE "gphone.rc1"
	
#ifdef G_OS_WIN32
gchar *package_prefix = PACKAGE_PREFIX;
gchar *package_data_dir = PACKAGE_DATA_DIR;
gchar *package_locale_dir = PACKAGE_LOCALE_DIR;
#endif


enum {
    PIXBUF_COL,
    TEXT_COL,
    TEXT_COL2,
    TEXT_COL3
};


GtkWidget *list;
GtkTreeSelection *selectionWANG;



/*把*.glade文件中的window引用到程序中来*/
GtkWidget* helloWorld (void)
{

  GtkWidget *window;
	GladeXML *gxml;
	
	gxml = glade_xml_new (GLADE_FILE, "window", NULL);
	
	/* This is important */
	glade_xml_signal_autoconnect (gxml);
	window = glade_xml_get_widget (gxml, "window");
	
	return window;
}


/*根据window 找到window内的任意控件*/

GtkWidget*  Get_XML_Widget (GtkWidget *window, gchar *  GladeWidgetName)
{

  GladeXML *gxml = glade_get_widget_tree((GtkWidget *)window);
    
	GtkWidget *Vobxi=(GtkWidget *)glade_xml_get_widget (gxml,GladeWidgetName);


	return Vobxi;
}



/*创建treeview的model*/

GtkTreeModel* createModel() {
    //const 
        gchar *files[] = {"王驻喜 13612939264", "大开 88839838",
                            "周达 13688815887", "NOKIA热线 8004005000",
                            "PIG  114","COW 118"};
    GdkPixbuf *pixbuf;
    GtkTreeIter iter;
    GtkListStore *store;
    gint i;


    store = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);

    for(i = 0; i < 6; i++) {
        //pixbuf = gdk_pixbuf_new_from_file(files[i], NULL);
        pixbuf = gdk_pixbuf_new_from_file(PIX_FILE, NULL);
        
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter,
                           PIXBUF_COL, pixbuf,
                           TEXT_COL, files[i],
		           -1);       
        gdk_pixbuf_unref(pixbuf);
    }

    return GTK_TREE_MODEL(store);
}

/*在label上显示treeview中的selection当前内容*/

gboolean selection_changed(GtkTreeSelection *selection, GtkLabel *label) {
    GtkTreeView *treeView;
    GtkTreeModel *model;
    GtkTreeIter iter;
    gchar *active;
    
    treeView = gtk_tree_selection_get_tree_view(selection);
    model = gtk_tree_view_get_model(treeView);
    gtk_tree_selection_get_selected(selection, &model, &iter);
    gtk_tree_model_get(model, &iter,
                       1, &active,
                       -1);

    gtk_label_set_text(label, active);
}


/*把entry的内容加到treeview中,条目会多一个*/
static void
append_item(GtkWidget *widget, gpointer entry)
{
  GtkListStore *store;
  GtkTreeIter  iter;

  const char *str = gtk_entry_get_text(entry); 

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

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


/*移除treeview当前选择项的内容*/
static void
remove_item(GtkWidget *widget, gpointer selection)
{
  GtkListStore *store;
  GtkTreeModel *model;
  GtkTreeIter  iter;


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

  if (gtk_tree_model_get_iter_first(model, &iter) == FALSE) 
      return;

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


/*移除treeview所有的内容*/
static void
remove_all(GtkWidget *widget, gpointer selection)
{
  GtkListStore *store;
  GtkTreeModel *model;
  GtkTreeIter  iter;


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

  if (gtk_tree_model_get_iter_first(model, &iter) == FALSE) 
      return;
  gtk_list_store_clear(store);
}





int main (int argc, char *argv[])
{
  GtkWidget *win ;
   GtkWidget *treeView;
    GtkCellRenderer *renderer;
    GtkTreeViewColumn *column;
    GtkWidget *label;
    GtkWidget *vbox;
    GtkWidget *statusbar;
    GtkTreeSelection *selection;
    GtkTreeModel *model;

  
//  gtk_rc_parse (RC_FILE);
	
	gtk_set_locale ();
	gtk_init (&argc, &argv);

  win = helloWorld();       //引进window



  /////////////////////////////////////////////////////////////////////////////


       treeView =  Get_XML_Widget(win,"treeview1");
       model = createModel();
       gtk_tree_view_set_model(GTK_TREE_VIEW(treeView),model);
       g_object_unref (model);
       list = treeView;
//=============================================================
    renderer = gtk_cell_renderer_pixbuf_new();
     column = gtk_tree_view_column_new_with_attributes(
                     "Icon", renderer, 
                     "pixbuf", PIXBUF_COL,
                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);

//=========================================================

    renderer = gtk_cell_renderer_text_new();
       g_object_set (G_OBJECT(renderer),
                  "foreground", "red", //设置前景色
                  "background", "black", //设置背景色
                  "font", "Nimbus Sans L 24", //设置字体
                  NULL);
    column = gtk_tree_view_column_new_with_attributes(
                     "Filename", renderer,
                     "text", TEXT_COL,
                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);

//====================================================

    renderer = gtk_cell_renderer_pixbuf_new();
     column = gtk_tree_view_column_new_with_attributes(
                     "Icon", renderer, 
                     "pixbuf", PIXBUF_COL,
                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);




    vbox =  Get_XML_Widget(win,"vbox1");
    label =  Get_XML_Widget(win,"label1");

    GtkWidget *button_add =  Get_XML_Widget(win,"button1");
    

    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
    selectionWANG = selection;


  


//    g_signal_connect(G_OBJECT(selection), "changed",
//                     G_CALLBACK(selection_changed), label);

    g_signal_connect(GTK_OBJECT(win), "destroy",
                     G_CALLBACK(gtk_main_quit), NULL);




    ///////////////////////////////////////////////////////////////////



  gtk_widget_show_all (win);
  gtk_main ();
  return 0;
}


/*自动回调button_add 键*/

G_MODULE_EXPORT void    button_add            (gpointer         user_data,
                                 GtkButton       *button)
{
GtkWidget *treeview;

    GladeXML *gxml = glade_get_widget_tree((GtkWidget *)button);
    
	GtkWidget *entry=(GtkWidget *)glade_xml_get_widget (gxml,"entry1");
  treeview=(GtkWidget *)glade_xml_get_widget (gxml,"treeview1");

  append_item(treeview,entry);


	return;
} 



/*自动回调button_remove 键*/

G_MODULE_EXPORT void    button_remove            (gpointer         user_data,
                                 GtkButton       *button)
{

GtkTreeSelection *selection;
GtkTreeIter iter;
gchar *active;
GtkTreeModel * model;

    GladeXML *gxml = glade_get_widget_tree((GtkWidget *)button);
    
	GtkWidget *treeview=(GtkWidget *)glade_xml_get_widget (gxml,"treeview1");
  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));

  GtkLabel *lb=(GtkLabel *)glade_xml_get_widget (gxml,"label1");

  remove_item(treeview,selection);
/*
  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
   model = gtk_tree_view_get_model((GtkTreeView *)treeview);
    gtk_tree_selection_get_selected(selection, &model, &iter);
    gtk_tree_model_get(model, &iter,
                       1, &active,
                       -1);
    gtk_label_set_text(lb, active);

*/

	return;
} 


/*自动回调button_removeall 键*/

G_MODULE_EXPORT void    button_removeall            (gpointer         user_data,
                                 GtkButton       *button)
{
    GladeXML *gxml = glade_get_widget_tree((GtkWidget *)button);
    
	GtkWidget *treeview=(GtkWidget *)glade_xml_get_widget (gxml,"treeview1");
  GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));

  remove_all(treeview,selection);
	

	return;
} 


/*自动回调button_open 键*/

G_MODULE_EXPORT void    button_open            (gpointer         user_data,
                                 GtkButton       *button)
{
gchar *filename;
gchar *content[100];
gsize bytes;
GError *error = NULL;


    GladeXML *gxml = glade_get_widget_tree((GtkWidget *)button);
    
    filename  =  gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(button));

    g_file_get_contents(filename, &content[0], &bytes, &error);
/*
    函数申明:   char   *fgets(char   *str,   int   num,   FILE   *fp)     
函数用途:   读一行字符,该行的字符数不大于num-1   
头   文   件:   stdio.h   
输入参数:   str:存放读入的字符数组指针;num:最大允许的读入字符数;fp:文件指针 
返   回   值:   操作成功时返回str指针,失败时返回NULL   
*/
//    g_open(filename,);
//    fseek
//        fgets();

//      g_print(content[0]);
      return;
} 



/*自动回调Menu_FileOpen 键*/

G_MODULE_EXPORT void    Menu_FileOpen            (gpointer         user_data,
                                 GtkButton       *button)
{
gchar      *filename;

    GladeXML *gxml = glade_get_widget_tree((GtkWidget *)button);


    //可以用下面的方法创建文件选择构件:
    GtkWidget *filew=gtk_file_selection_new( "File selection" ); 

    //要设置文件名,例如,要在打开时指向指定目录,或者给定一个缺省文件名,可以使用下面的函数:
//        void gtk_file_selection_set_filename( GtkFileSelection *filesel,
//                                       filename ); 


        g_print(filename);

        gtk_widget_show (filew);

	return;
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -