Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 暂时用其他容器替换容器_C_Pygtk_Gtk_Gtk2 - Fatal编程技术网

C 暂时用其他容器替换容器

C 暂时用其他容器替换容器,c,pygtk,gtk,gtk2,C,Pygtk,Gtk,Gtk2,我目前正在编写一个GTK应用程序,它由一个带有GtkListView和一个按钮的窗口组成。当用户按下按钮时,将出现允许插入新数据以附加到列表中的某种形式 我希望它临时替换GtkListView,而不是为表单打开一个新窗口。我对GTK非常陌生,所以我想知道是否有一种惯用的方法来实现这一点 我目前的猜测是,我必须添加一个带有两个隐藏选项卡的笔记本,一个用于列表,一个用于表单。每当按下按钮时,我都会发出焦点选项卡信号以切换到表单选项卡 是否有更好的方法临时替换GtkListView?您可以尝试在按钮的

我目前正在编写一个GTK应用程序,它由一个带有
GtkListView
和一个按钮的窗口组成。当用户按下按钮时,将出现允许插入新数据以附加到列表中的某种形式

我希望它临时替换
GtkListView
,而不是为表单打开一个新窗口。我对GTK非常陌生,所以我想知道是否有一种惯用的方法来实现这一点

我目前的猜测是,我必须添加一个带有两个隐藏选项卡的笔记本,一个用于列表,一个用于表单。每当按下按钮时,我都会发出
焦点选项卡
信号以切换到表单选项卡

是否有更好的方法临时替换
GtkListView

您可以尝试在按钮的回调中使用&来实现此目的。将第一个视图添加到容器中。在用户单击按钮时,删除第一个视图并添加下一个视图。反之亦然。确保在添加到容器之前添加对小部件的引用,因为如果小部件从容器中删除&如果没有对小部件的引用,小部件将被销毁。以下是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;
} 
#包括
静态GtkWidget*view0;
静态GtkWidget*view1;
静态GtkWidget*帧;
静态int当前视图id;
静态GtkWidget*
创建视图0(无效)
{
GtkWidget*scrolled_window=gtk_scrolled_window_new(NULL,NULL);
gtk_滚动窗口_设置_策略(gtk_滚动窗口(滚动窗口),
GTK_策略_自动,GTK_策略_自动);
GtkWidget*view0_content=gtk_label_new(“这是第一个视图”);
gtk_滚动_窗口_添加_与_视口(gtk_滚动_窗口
(滚动窗口),查看0内容);
gtk_小部件_显示_全部(滚动窗口);
返回滚动窗口;
}
静态GtkWidget*
创建视图1(无效)
{
GtkWidget*scrolled_window=gtk_scrolled_window_new(NULL,NULL);
GtkWidget*view1_content=gtk_label_new(“这是下一个视图”);
gtk_滚动窗口_设置_策略(gtk_滚动窗口(滚动窗口),
GTK_策略_自动,GTK_策略_自动);
gtk_滚动_窗口_添加_与_视口(gtk_滚动_窗口
(滚动窗口),查看1\u内容);
gtk_小部件_显示_全部(滚动窗口);
返回滚动窗口;
}
静态gboolean
更改视图(GtkWidget*按钮,gpointer数据)
{
(b)数据;
如果(当前视图id==0)
{
gtk_按钮设置标签(gtk_按钮(按钮),“上一个”);
gtk_容器移除(gtk_容器(框架),视图0);
/*需要添加引用,因为容器将拥有小部件引用*/
/*如果使用小部件的最后一个引用调用gtk_容器_remove,小部件将被销毁*/
g_对象_参考(视图1);
gtk_容器添加(gtk_容器(框架),视图1);
当前视图id=1;
}
其他的
{
gtk_按钮设置标签(gtk_按钮(按钮),“下一步”);
gtk_容器移除(gtk_容器(框架),视图1);
/*需要添加引用,因为容器将拥有小部件引用*/
/*如果使用小部件的最后一个引用调用gtk_容器_remove,小部件将被销毁*/
g_对象_参考(视图0);
gtk_容器添加(gtk_容器(框架),视图0);
当前视图id=0;
}
返回FALSE;
}
int
主(空)
{
GtkWidget*窗口;
GtkWidget*vbox;
GtkWidget*标签;
GtkWidget*按钮;
gtk_init(NULL,NULL);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
vbox=gtk_vbox_new(假,5);
gtk_容器添加(gtk_容器(窗口),vbox);
frame=gtk_frame_new(“视图更改示例”);
view0=创建_view0();
view1=创建_view1();
/*需要添加引用,因为容器将拥有小部件引用*/
/*如果使用小部件的最后一个引用调用gtk_容器_remove,小部件将被销毁*/
g_对象_参考(视图0);
gtk_容器添加(gtk_容器(框架),视图0);
标签=gtk_标签_新(“视图更改样本”);
按钮=gtk_按钮_新按钮_,带有标签(“下一步”);
g_信号连接(按钮“点击”,g_回调(更改视图),空);
gtk_盒包装开始(gtk_盒(vbox),标签,假,假,0);
gtk_-box_-pack_启动(gtk_-box(vbox),帧,假,假,0);
gtk_盒包装启动(gtk_盒(vbox),按钮,假,假,0);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
} 
希望这有帮助

您可以尝试在按钮的回调中使用&来实现这一点。将第一个视图添加到容器中。在用户单击按钮时,删除第一个视图并添加下一个视图。反之亦然。确保在添加到容器之前添加对小部件的引用,因为如果小部件从容器中删除&如果没有对小部件的引用,小部件将被销毁。以下是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;
} 
#包括
静态GtkWidget*view0;
静态GtkWidget*view1;
静态GtkWidget*帧;
静态int当前视图id;
静态GtkWidget*
创建视图0(无效)
{
GtkWidget*scrolled_window=gtk_scrolled_window_new(NULL,NULL);
gtk_滚动窗口_设置_策略(gtk_滚动窗口(滚动窗口),
GTK_策略_自动,GTK_策略_自动);
GtkWidget*view0_content=gtk_label_new(“这是第一个视图”);
gtk_滚动_窗口_添加_与_视口(gtk_滚动_窗口
(滚动窗口),查看0内容);
gtk_小部件_显示_全部(滚动窗口);
返回滚动窗口;
}
静态GtkWidget*
创建视图1(无效)
{
GtkWidget*scrolled_window=gtk_scrolled_window_new(NULL,NULL);
GtkWidget*view1_content=gtk_label_new(“这是下一个视图”);
gtk_滚动窗口_设置_策略(gtk_滚动窗口(滚动窗口),
GTK_策略_自动,GTK_策略_自动);
gtk_滚动_窗口_添加_与_视口(gtk_滚动_窗口
(滚动窗口),查看1\u内容);
gtk_小部件_显示_全部(滚动窗口);
返回滚动窗口;
}
静态gboolean
更改视图(GtkWidget*按钮,gpointer数据)
{
(b)数据;
如果(咖喱)