我想制作一个包含多个视图的GTK +应用程序,我真的不知道如何以最佳方式实现它。在每个视图中,我需要一些标签和按钮。首先我尝试用GtkStack进行应用,但StackSwitcher的定制选项很差(它的按钮在行中,堆栈切换图标太小,即使最大可能的大小有“icon-size”属性)。
使用普通按钮连接堆栈的页面切换可以解决问题,但我不知道如何做这样的事情。
我的第二种方法是使用多个窗口。我能够制作几个窗口并用按钮隐藏/显示它们。不幸的是,该应用程序将在非常糟糕的PC上运行(更多的是PC连接到触摸屏,这使得它的性能更差)并且经过一些测试后我可以说应用程序有一些滞后。整个事情使得所有窗口都在开始,然后隐藏它们或显示它们(取决于按下哪个窗口的按钮)。
总结一下我的问题:
答案 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);