我正在使用C在gtk中创建应用程序。我有一个带GtkStackSwitcher的GtkStack,我不知道如何在堆栈切换器中将图像/图标设置为按钮。我在gtkmm和C ++中的应用程序有类似的问题,但我能够在文档中找到所需的功能。这次,在搜索了GtkStack,GtkStackSwitcher和GtkContainer的文档之后,我在GtkStack和GtkStackSwitcher中找不到任何有用的东西。在GtkContainer中有函数gtk_container_child_set_property ()
。它可能是我正在寻找的功能,但我不知道如何将图标名称放入GValue中,如果可能的话。
总结一下 - 我可以使用上述功能或使用任何其他方法将图标设置为GtkStackSwitcher的按钮吗?
编辑: 也许用css可以实现这个目标?为GtkStack和GtkStackSwticher设置背景图像不起作用,但为按钮设置background_image可以正常工作。工作非常糟糕,但有效。图像不适合按钮,按钮不会调整为图像大小(如果我从pixbuf设置按钮新按钮确实调整大小)。那么有可能用css还是死路一条呢?
答案 0 :(得分:1)
从GtkStack文档Child Properties,您可以看到属性"icon-name"
:
“icon-name”子属性
“icon-name” gchar *
子页面的图标名称。
标志:读/写
默认值:NULL
正如您所指出的,我们可以在GtkStack(GtkContainer)上使用gtk_container_child_set_property
并设置图标。问题是堆栈使用图标或标题,而不是两者。
以下是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;
}
用以下内容编译:
gcc -o test main.c `pkg-config --cflags --libs gtk+-3.0`
,结果应为:
修改强>
根据评论中的要求:
您能告诉我如何更改堆栈切换器图标的图标大小吗? 我看到堆栈切换器具有属性“icon-size”......
GtkStackSwitcher拥有属性"icon-size"
,但它是在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
值,因此您可以尝试一些值并验证大小。还有一个包含图标默认大小的枚举类型,它是GtkIconSize
。在示例中,我使用了GTK_ICON_SIZE_LARGE_TOOLBAR(24px)。