【问题标题】:How to use images in GTK Stack Switcher using C如何使用 C 在 GTK Stack Switcher 中使用图像
【发布时间】:2018-02-07 09:43:47
【问题描述】:

我正在使用 C 在 gtk 中制作应用程序。我有一个带有 GtkStackSwitcher 的 GtkStack,但我不知道如何将图像/图标设置为堆栈切换器中的按钮。我在 gtkmm 和 C++ 中的应用程序有类似的问题,但我能够在文档中找到所需的功能。这一次,在搜索了 GtkStack、GtkStackSwitcher 和 GtkContainer 的文档后,我没有发现 GtkStack 和 GtkStackSwitcher 中的任何有用的东西。在 GtkContainer 中有函数gtk_container_child_set_property ()。这可能是我正在寻找的功能,但我不知道如何将图标名称放入 GValue 以及是否可能。 综上所述 - 我可以使用上述功能或使用任何其他方法将图标设置为 GtkStackSwitcher 的按钮吗?

编辑: 也许有可能用css实现这一点?为 GtkStack 和 GtkStackSwticher 设置 background-image 不起作用,但为按钮设置 background_image 有效。工作非常糟糕但有效。图像不适合按钮,并且按钮不会调整为图像大小(如果我从 pixbuf 设置新按钮,则按钮会调整大小)。那么css有可能还是死路一条?

【问题讨论】:

    标签: c gtk gtk3


    【解决方案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`
    

    结果应该是:

    编辑:

    根据 cmets 的要求:

    您能告诉我如何更改堆栈切换器图标的图标大小吗? 我看到堆栈切换器具有属性“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)。

    【讨论】:

    • 您能告诉我如何更改堆栈切换器图标的图标大小吗?我看到堆栈切换器具有属性“icon-size”,但由于缺乏示例,我不知道如何设置此属性。
    • @P.B.检查答案底部的编辑。
    猜你喜欢
    • 2023-03-10
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多