Временно замените контейнер на другой контейнер - PullRequest
1 голос
/ 17 декабря 2011

В настоящее время я пишу приложение GTK, которое состоит из одного окна с GtkListView и кнопки. Когда пользователь нажимает кнопку, появляется какая-то форма, позволяющая вставить новые данные для добавления в список.

Вместо того, чтобы открывать новое окно для формы, я бы хотел временно заменить GtkListView. Я довольно новичок в GTK, поэтому я хотел бы знать, есть ли идиоматический способ сделать это.

В настоящее время я предполагаю, что мне нужно добавить блокнот с двумя скрытыми вкладками, одна для списка и одна для формы. При каждом нажатии кнопки я посылаю сигнал focus-tab для переключения на вкладку формы.

Есть ли лучший способ временно заменить GtkListView?

Ответы [ 2 ]

2 голосов
/ 18 декабря 2011

Вам не нужен блокнот для создания временных виджетов, вы можете просто использовать простую коробку Я использую следующее:

  # displaying the list view
  container = gtk.VBox()
  container.add(tree_view)

  # removing the treeview and adding a form
  container.remove(tree_view)
  container.add(form)
  form.show()
2 голосов
/ 17 декабря 2011

Вы можете попробовать использовать gtk_container_add & gtk_container_remove в функции обратного вызова кнопки, чтобы добиться этого. Добавьте свой первый вид в контейнер. При нажатии пользователем на кнопку, удалите первый вид и добавьте следующий. И наоборот. Обязательно добавьте ссылку на виджет перед добавлением в контейнер, потому что если виджет удален из контейнера и если нет ссылок на виджет, виджет уничтожается. Вот образец в C для вашей справки:

#include <gtk/gtk.h>

static GtkWidget *view0;
static GtkWidget *view1;
static GtkWidget *frame;
static int current_view_id;

static GtkWidget *
create_view0 (void)
{
  GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  GtkWidget *view0_content = gtk_label_new ("Here is first view");
  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW
                     (scrolled_window), view0_content);
  gtk_widget_show_all (scrolled_window);
  return scrolled_window;
}

static GtkWidget *
create_view1 (void)
{
  GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
  GtkWidget *view1_content = gtk_label_new ("Here is next view");
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW
                     (scrolled_window), view1_content);
  gtk_widget_show_all (scrolled_window);
  return scrolled_window;
}

static gboolean
change_view (GtkWidget * button, gpointer data)
{
  (void) data;

  if (current_view_id == 0)
    {
      gtk_button_set_label (GTK_BUTTON (button), "Prev");
      gtk_container_remove (GTK_CONTAINER (frame), view0);
      /* Need to add reference as container will own widget ref */
      /* If gtk_container_remove is called with widget's last ref, widget is destroyed */
      g_object_ref (view1);
      gtk_container_add (GTK_CONTAINER (frame), view1);
      current_view_id = 1;
    }
  else
    {
      gtk_button_set_label (GTK_BUTTON (button), "Next");
      gtk_container_remove (GTK_CONTAINER (frame), view1);
      /* Need to add reference as container will own widget ref */
      /* If gtk_container_remove is called with widget's last ref, widget is destroyed */
      g_object_ref (view0);
      gtk_container_add (GTK_CONTAINER (frame), view0);
      current_view_id = 0;
    }

  return FALSE;
}

int
main (void)
{
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *label;
  GtkWidget *button;

  gtk_init (NULL, NULL);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  vbox = gtk_vbox_new (FALSE, 5);
  gtk_container_add (GTK_CONTAINER (window), vbox);

  frame = gtk_frame_new (" Sample for view change ");
  view0 = create_view0 ();
  view1 = create_view1 ();

  /* Need to add reference as container will own widget ref */
  /* If gtk_container_remove is called with widget's last ref, widget is destroyed */
  g_object_ref (view0);
  gtk_container_add (GTK_CONTAINER (frame), view0);

  label = gtk_label_new ("View change sample");
  button = gtk_button_new_with_label ("Next");
  g_signal_connect (button, "clicked", G_CALLBACK (change_view), NULL);
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
  gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
  gtk_widget_show_all (window);

  gtk_main ();
  return 0;
} 

Надеюсь, это поможет!

...