📄 gtk_tut-31.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>GTK v1.2 Tutorial: List Widget</TITLE> <LINK HREF="gtk_tut-30.html" REL=previous> <LINK HREF="gtk_tut.html#toc31" REL=contents></HEAD><BODY BGCOLOR="#FFFFFF">Next<A HREF="gtk_tut-30.html">Previous</A><A HREF="gtk_tut.html#toc31">Contents</A><HR NOSHADE><H2><A NAME="s31">31. List Widget</A></H2><P>NOTE: The GtkList widget has been superseded by the GtkCListwidget. It is detailed here just for completeness.<P>The GtkList widget is designed to act as a vertical container forwidgets that should be of the type GtkListItem.<P>A GtkList widget has its own window to receive events and its ownbackground color which is usually white. As it is directly derivedfrom a GtkContainer it can be treated as such by using theGTK_CONTAINER(List) macro, see the GtkContainer widget for more onthis. One should already be familiar with the usage of a GList andits related functions g_list_*() to be able to use the GtkList widgetto it full extent.<P>There is one field inside the structure definition of the GtkListwidget that will be of greater interest to us, this is:<P><BLOCKQUOTE><CODE><PRE>struct _GtkList{ ... GList *selection; guint selection_mode; ...}; </PRE></CODE></BLOCKQUOTE><P>The selection field of a GtkList points to a linked list of all itemsthat are currently selected, or NULL if the selection is empty. So tolearn about the current selection we read the GTK_LIST()->selectionfield, but do not modify it since the internal fields are maintainedby the gtk_list_*() functions.<P>The selection_mode of the GtkList determines the selection facilitiesof a GtkList and therefore the contents of the GTK_LIST()->selectionfield. The selection_mode may be one of the following:<P><UL><LI> GTK_SELECTION_SINGLE - The selection is either NULLor contains a GList pointerfor a single selected item.</LI><LI> GTK_SELECTION_BROWSE - The selection is NULL if the listcontains no widgets or insensitiveones only, otherwise it containsa GList pointer for one GListstructure, and therefore exactlyone list item.</LI><LI> GTK_SELECTION_MULTIPLE - The selection is NULL if no listitems are selected or a GList pointerfor the first selected item. Thatin turn points to a GList structurefor the second selected item and soon.</LI><LI> GTK_SELECTION_EXTENDED - The selection is always NULL.</LI></UL><P>The default is GTK_SELECTION_MULTIPLE.<P><H2><A NAME="ss31.1">31.1 Signals</A></H2><P><BLOCKQUOTE><CODE><PRE>void selection_changed( GtkList *list );</PRE></CODE></BLOCKQUOTE><P>This signal will be invoked whenever the selection field of a GtkListhas changed. This happens when a child of the GtkList got selected ordeselected.<P><BLOCKQUOTE><CODE><PRE>void select_child( GtkList *list, GtkWidget *child);</PRE></CODE></BLOCKQUOTE><P>This signal is invoked when a child of the GtkList is about to getselected. This happens mainly on calls to gtk_list_select_item(),gtk_list_select_child(), button presses and sometimes indirectlytriggered on some else occasions where children get added to orremoved from the GtkList.<P><BLOCKQUOTE><CODE><PRE>void unselect_child( GtkList *list, GtkWidget *child );</PRE></CODE></BLOCKQUOTE><P>This signal is invoked when a child of the GtkList is about to getdeselected. This happens mainly on calls to gtk_list_unselect_item(),gtk_list_unselect_child(), button presses and sometimes indirectlytriggered on some else occasions where children get added to orremoved from the GtkList.<P><H2><A NAME="ss31.2">31.2 Functions</A></H2><P><BLOCKQUOTE><CODE><PRE>guint gtk_list_get_type( void );</PRE></CODE></BLOCKQUOTE><P>Returns the `GtkList' type identifier.<P><BLOCKQUOTE><CODE><PRE>GtkWidget *gtk_list_new( void );</PRE></CODE></BLOCKQUOTE><P>Create a new GtkList object. The new widget is returned as a pointerto a GtkWidget object. NULL is returned on failure.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_insert_items( GtkList *list, GList *items, gint position );</PRE></CODE></BLOCKQUOTE><P>Insert list items into the list, starting at <CODE>position</CODE>.<CODE>items</CODE> is a doubly linked list where each nodes data pointer isexpected to point to a newly created GtkListItem. The GList nodes of<CODE>items</CODE> are taken over by the list.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_append_items( GtkList *list, GList *items);</PRE></CODE></BLOCKQUOTE><P>Insert list items just like gtk_list_insert_items() at the end of thelist. The GList nodes of <CODE>items</CODE> are taken over by the list.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_prepend_items( GtkList *list, GList *items);</PRE></CODE></BLOCKQUOTE><P>Insert list items just like gtk_list_insert_items() at the verybeginning of the list. The GList nodes of <CODE>items</CODE> are taken over bythe list.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_remove_items( GtkList *list, GList *items);</PRE></CODE></BLOCKQUOTE><P>Remove list items from the list. <CODE>items</CODE> is a doubly linked listwhere each nodes data pointer is expected to point to a direct childof list. It is the callers responsibility to make a call tog_list_free(items) afterwards. Also the caller has to destroy the listitems himself.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_clear_items( GtkList *list, gint start, gint end );</PRE></CODE></BLOCKQUOTE><P>Remove and destroy list items from the list. A widget is affected ifits current position within the list is in the range specified by<CODE>start</CODE> and <CODE>end</CODE>.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_select_item( GtkList *list, gint item );</PRE></CODE></BLOCKQUOTE><P>Invoke the select_child signal for a list item specified through itscurrent position within the list.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_unselect_item( GtkList *list, gint item);</PRE></CODE></BLOCKQUOTE><P>Invoke the unselect_child signal for a list item specified through itscurrent position within the list.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_select_child( GtkList *list, GtkWidget *child);</PRE></CODE></BLOCKQUOTE><P>Invoke the select_child signal for the specified child.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_unselect_child( GtkList *list, GtkWidget *child);</PRE></CODE></BLOCKQUOTE><P>Invoke the unselect_child signal for the specified child.<P><BLOCKQUOTE><CODE><PRE>gint gtk_list_child_position( GtkList *list, GtkWidget *child);</PRE></CODE></BLOCKQUOTE><P>Return the position of <CODE>child</CODE> within the list. "-1" is returned onfailure.<P><BLOCKQUOTE><CODE><PRE>void gtk_list_set_selection_mode( GtkList *list, GtkSelectionMode mode );</PRE></CODE></BLOCKQUOTE><P>Set the selection mode MODE which can be of GTK_SELECTION_SINGLE,GTK_SELECTION_BROWSE, GTK_SELECTION_MULTIPLE orGTK_SELECTION_EXTENDED.<P><BLOCKQUOTE><CODE><PRE>GtkList *GTK_LIST( gpointer obj );</PRE></CODE></BLOCKQUOTE><P>Cast a generic pointer to `GtkList *'. *Note Standard Macros::, formore info.<P><BLOCKQUOTE><CODE><PRE>GtkListClass *GTK_LIST_CLASS( gpointer class);</PRE></CODE></BLOCKQUOTE><P>Cast a generic pointer to `GtkListClass*'. *Note Standard Macros::,for more info.<P><BLOCKQUOTE><CODE><PRE>gint GTK_IS_LIST( gpointer obj);</PRE></CODE></BLOCKQUOTE><P>Determine if a generic pointer refers to a `GtkList' object. *NoteStandard Macros::, for more info.<P><H2><A NAME="ss31.3">31.3 Example</A></H2><P>Following is an example program that will print out the changes of theselection of a GtkList, and lets you "arrest" list items into a prisonby selecting them with the rightmost mouse button.<P><BLOCKQUOTE><CODE><PRE>/* example-start list list.c *//* Include the gtk+ header files * Include stdio.h, we need that for the printf() function */#include <gtk/gtk.h>#include <stdio.h>/* This is our data identification string to store * data in list items */const gchar *list_item_data_key="list_item_data";/* prototypes for signal handler that we are going to connect * to the GtkList widget */static void sigh_print_selection( GtkWidget *gtklist, gpointer func_data);static void sigh_button_event( GtkWidget *gtklist, GdkEventButton *event, GtkWidget *frame );/* Main function to set up the user interface */gint main (int argc, gchar *argv[]){ GtkWidget *separator; GtkWidget *window; GtkWidget *vbox; GtkWidget *scrolled_window; GtkWidget *frame; GtkWidget *gtklist; GtkWidget *button; GtkWidget *list_item; GList *dlist; guint i; gchar buffer[64]; /* Initialize gtk+ (and subsequently gdk) */ gtk_init(&argc, &argv); /* Create a window to put all the widgets in * connect gtk_main_quit() to the "destroy" event of * the window to handle window manager close-window-events */ window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GtkList Example"); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL); /* Inside the window we need a box to arrange the widgets
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -