LINUX.ORG.RU

вопрос по программированию gtk+


0

0

вопрос по программированию gtk+

есть vbox (VBOX), содержащий hbox и кнопку.
hbox содержит два виджета разделенных separator'ом.
Один из этих виджетов - лист (см. GtkWidget a()).
Вопрос: необходимо, чтобы по нажатию кнопки (button) обновилось содержимое
виджета Leftwidget. Что для этого нужно прописать в xxx и, возможно,
добавить в g_signal_connect?

//---------------------------------------------------
static void xxx (GtkWidget *button, gpointer data) { ??? }
//---------------------------------------------------
int main(int argc, char *argv[]) {
...
GtkWidget *VBOX = gtk_vbox_new (FALSE, 1);
GtkWidget * hbox = gtk_hbox_new(FALSE, 0);
GtkWidget *Separator = gtk_vseparator_new();
GtkWidget *button = gtk_button_new_with_label("Hi!");
GtkWidget *Lefwidget = a();

gtk_box_pack_start (GTK_BOX (VBOX), hbox, TRUE, TRUE, 0);

gtk_box_pack_start (GTK_BOX (hbox), Lefwidget, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (hbox), Separator, FALSE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (hbox), Rigwidget, TRUE, TRUE, 0);

g_signal_connect(button, "clicked", xxx, NULL);

gtk_box_pack_start (GTK_BOX (VBOX), button, FALSE, FALSE, 0);
...
}
//---------------------------------------------------
GtkWidget a(){
GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
GtkWidget *tree_view = gtk_tree_view_new ();
GtkListStore *list = gtk_list_store_new ( ... );
GtkTreeIter iter;
gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (list));
gtk_widget_show (tree_view);
for ( ... ) { //заполняем лист
gtk_list_store_append (GTK_LIST_STORE (list), &iter);
gtk_list_store_set (GTK_LIST_STORE (list), &iter, ..., -1);
}
GtkCellRenderer *cell;
GtkTreeViewColumn *column;
//
column = gtk_tree_view_column_new_with_attributes ("столбец1", cell, "text", 0, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), GTK_TREE_VIEW_COLUMN (column));

column = gtk_tree_view_column_new_with_attributes ("столбец2", cell, "text", 1, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), GTK_TREE_VIEW_COLUMN (column));


return scrolled_window;
}
//---------------------------------------------------


void add_line_cb (GObject* obj, gpointer data)
{
  GtkTreeModel *model = GTK_TREE_MODEL(data);
  GtkTreeIter iter;

  gtk_list_store_append( GTK_LIST_STORE (model), &iter);
  gtk_list_store_set (GTK_LIST_STORE(model), &iter, ...., -1);
}

GtkWidget * create_tree_view(GtkTreeModel **model)
{
   .....
   *model = GTK_TREE_MODEL(list);
   return scrolled_window;
}

main() 
{
GtkTreeModel *model;
create_tree_view(&model);
g_signal_connect(button, "clicked", G_CALLBACK(add_line_cb), model);
}

Хотя можно модель создавать отдельно, view отдельно. Но это как кому нравится. 

anonymous
()
Ответ на: комментарий от anonymous

//Задам вопрос по-другому, на конкретном работающем примере.
//Есть лист заполненный 10 элементами, при нажатии кнопки "enter"
//на любом элементе выводится сообщение "Hello". Как сделать чтобы
//вместо вывода сообщения 1)лист "очистился" от всех элементов 2)в лист добавилось
//несколько новых элементов (напр. 3 элемента "opennet")?
//gcc file.c -o file -Wall `pkg-config gtk+-2.0 --cflags --libs`

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

void sss( gpointer data) { puts("Hello"); }
//--------------------------------------------------------------------
GtkWidget *create_list( void ) {

GtkWidget *scrolled_window, *tree_view;
GtkListStore *model;
GtkTreeIter iter;
GtkCellRenderer *cell;
GtkTreeViewColumn *column;
int i;
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
model = gtk_list_store_new (1, G_TYPE_STRING);
tree_view = gtk_tree_view_new ();
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), tree_view);
gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (model));
gtk_widget_show (tree_view);
for (i = 0; i < 10; i++) {
gchar *msg = g_strdup_printf ("Message #%d", i);
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, msg, -1);
g_free (msg);
}
cell = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes ("Messages", cell, "text", 0, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), GTK_TREE_VIEW_COLUMN (column));
g_signal_connect (G_OBJECT (tree_view), "select-cursor-row", G_CALLBACK (sss), NULL);
return scrolled_window;
}
//---------------------------------------------------------------------
int main( int argc, char *argv[])
{
GtkWidget *window, *list;

gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Hi");
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
gtk_widget_set_size_request (GTK_WIDGET (window), 450, 400);
list = create_list ();
gtk_container_add (GTK_CONTAINER (window), list);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}

manny21
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.