如何在GTK应用程序中创建多个视图

时间:2018-03-27 08:32:39

标签: c gtk gtk3

我想制作一个包含多个视图的GTK +应用程序,我真的不知道如何以最佳方式实现它。在每个视图中,我需要一些标签和按钮。首先我尝试用GtkStack进行应用,但StackSwitcher的定制选项很差(它的按钮在行中,堆栈切换图标太小,即使最大可能的大小有“icon-size”属性)。

使用普通按钮连接堆栈的页面切换可以解决问题,但我不知道如何做这样的事情。

我的第二种方法是使用多个窗口。我能够制作几个窗口并用按钮隐藏/显示它们。不幸的是,该应用程序将在非常糟糕的PC上运行(更多的是PC连接到触摸屏,这使得它的性能更差)并且经过一些测试后我可以说应用程序有一些滞后。整个事情使得所有窗口都在开始,然后隐藏它们或显示它们(取决于按下哪个窗口的按钮)。

总结一下我的问题:

  1. 制作此类应用程序的最佳方式是什么?有多个窗口或GtkStack?
  2. 如果用windows如何优化整个东西?
  3. 如果使用堆栈如何在普通按钮上实现switchng stack的选项卡?

1 个答案:

答案 0 :(得分:1)

我更喜欢GtkStack。它有令人敬畏的gtk_stack_set_visible_child_name,让你通过它的ID设置可见的孩子。在下面的代码片段中,我使用GtkListBox进行切换(我必须存储带有子名称的GPtrArray

static void
row_activated (GtkListBox    *box,
               GtkListBoxRow *row,
               gpointer       udata)
{
  MyWid *self = udata;
  MyWidPrivate *priv = self->priv;

  gint row_index = gtk_list_box_row_get_index (row);
  gchar *path = g_ptr_array_index (priv->paths, row_index);

  gtk_stack_set_visible_child_name (priv->stack, path);
}

如果您想使用GtkButton,事情就更简单了:

gchar *id; // just a string, that allows you to connect buttons and tabs
GtkWidget *child, *button;
child = create_tab_for_id (id); // not a real function! You should define it yourself
gtk_stack_add_named (stack, child, id);
button = create_button_for_id (id); // also not a real function
/* Time for magic */
g_signal_connect_swapped (button, "clicked", 
                          G_CALLBACK (gtk_stack_set_visible_child_name),
                          stack);