如何使用C在GTK堆栈切换器中使用图像

如何使用C在GTK堆栈切换器中使用图像,c,gtk,gtk3,C,Gtk,Gtk3,我正在使用C在gtk中制作应用程序。我有一个带有GtkStackSwitcher的GtkStack,我不知道如何设置堆栈切换器中按钮的图像/图标。我在GTKMM和C++中应用类似的问题,但是我能够在文档中找到所需的功能。这一次,在搜索了GtkStack、GtkStackSwitcher和GtkContainer的文档之后,我在GtkStack和GtkStackSwitcher中没有找到任何有用的东西。在GtkContainer中有一个函数gtk\u容器\u子\u集\u属性()。这可能是我正在寻找

我正在使用C在gtk中制作应用程序。我有一个带有GtkStackSwitcher的GtkStack,我不知道如何设置堆栈切换器中按钮的图像/图标。我在GTKMM和C++中应用类似的问题,但是我能够在文档中找到所需的功能。这一次,在搜索了GtkStack、GtkStackSwitcher和GtkContainer的文档之后,我在GtkStack和GtkStackSwitcher中没有找到任何有用的东西。在GtkContainer中有一个函数
gtk\u容器\u子\u集\u属性()
。这可能是我正在寻找的函数,但我不知道如何将图标名称放入GValue,如果可能的话。 总而言之,我可以使用上述功能或使用任何其他方法将图标设置为GtkStackSwitcher的按钮吗

编辑: 也许可以用css实现这一点?为GtkStack和GtkStackSwticher设置背景图像不起作用,但为按钮设置背景图像起作用。效果很差,但效果很好。图像不适合按钮,并且按钮的大小也不会调整为图像大小(如果我从pixbuf中设置了button new,则按钮会调整大小)。那么,css是可行的还是死路一条?

从文档中,您可以看到属性:

图标名称子属性

“图标名称”gchar*

子页面的图标名称

标志:读/写

默认值:NULL

正如您所指出的,我们可以在GtkStack(GtkContainer)上使用并设置图标。问题是堆栈使用图标或标题,而不是两者

下面是C代码中的一个简单示例:

#include <gtk/gtk.h>

int main (int argc, char** argv) {
   GtkBox *box;
   GtkStack *stack;
   GtkLabel *label1;
   GtkLabel *label2;
   GtkWindow *window;
   GtkStackSwitcher *switcher;
   GValue iconval1 = G_VALUE_INIT;
   GValue iconval2 = G_VALUE_INIT;

   gtk_init (&argc, &argv);

   g_value_init (&iconval1, G_TYPE_STRING);
   g_value_init (&iconval2, G_TYPE_STRING);

   window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
   box    = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 6));
   stack  = GTK_STACK(gtk_stack_new ());
   switcher = GTK_STACK_SWITCHER(gtk_stack_switcher_new ());

   label1 = GTK_LABEL(gtk_label_new("Stack Page 1"));
   label2 = GTK_LABEL(gtk_label_new("Stack Page 2"));

   gtk_stack_add_titled(stack, GTK_WIDGET(label1), "Page 1", "Page 1");
   gtk_stack_add_titled(stack, GTK_WIDGET(label2), "Page 2", "Page 2");

   gtk_widget_set_halign (GTK_WIDGET(switcher), GTK_ALIGN_CENTER);

   g_value_set_string(&iconval1, "zoom-in-symbolic.symbolic");
   g_value_set_string(&iconval2, "zoom-out-symbolic.symbolic");

   gtk_container_child_set_property(GTK_CONTAINER(stack), GTK_WIDGET(label1), "icon-name", &iconval1);
   gtk_container_child_set_property(GTK_CONTAINER(stack), GTK_WIDGET(label2), "icon-name", &iconval2);

   gtk_stack_switcher_set_stack (switcher, stack);
   gtk_box_pack_start (box, GTK_WIDGET(switcher), FALSE, FALSE, 6);
   gtk_box_pack_start (box, GTK_WIDGET(stack), TRUE, TRUE, 6);

   gtk_container_add (GTK_CONTAINER(window), GTK_WIDGET(box));

   g_signal_connect(G_OBJECT(window), "destroy", gtk_main_quit, NULL);

   gtk_widget_show_all (GTK_WIDGET(window));

   gtk_main ();

   return 0;
}
结果应该是:

编辑:

按照评论中的要求:


您能告诉我如何更改堆栈切换器图标的图标大小吗? 我看到堆栈切换器有属性“图标大小”

具有该属性,但它是在Gtk+3.20中引入的。所以,为了使用这个属性,有一个要求

要设置Gtk+不提供setter/getter的属性,应使用g_object_set(或set_full)

使用上述代码:

   ...
   switcher = GTK_STACK_SWITCHER(gtk_stack_switcher_new ());

   g_object_set(G_OBJECT(switcher), "icon-size", GTK_ICON_SIZE_LARGE_TOOLBAR, NULL);

   label1 = GTK_LABEL(gtk_label_new("Stack Page 1"));
   ...

该属性是一个
gint
值,因此您可以尝试一些值并验证大小。还有一个枚举类型包含图标的默认大小,它是。在这个示例中,我使用了GTK_ICON_SIZE_LARGE_工具栏(24px)。

您能告诉我如何更改堆栈切换器图标的图标大小吗?我看到堆栈切换器有“图标大小”属性,但由于缺少示例,我不知道如何设置该属性。@P.B.检查答案底部的编辑。
   ...
   switcher = GTK_STACK_SWITCHER(gtk_stack_switcher_new ());

   g_object_set(G_OBJECT(switcher), "icon-size", GTK_ICON_SIZE_LARGE_TOOLBAR, NULL);

   label1 = GTK_LABEL(gtk_label_new("Stack Page 1"));
   ...