如何使用CSS样式化GtkLabel?

7

我想使用CSS来为GtkLabel添加样式。我想要改变标签的颜色和字体大小。以下是我的C代码:

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    GtkWidget *label = gtk_label_new("Label");

    GtkCssProvider *cssProvider = gtk_css_provider_new();
    gtk_css_provider_load_from_path(cssProvider, "theme.css", NULL);
    gtk_style_context_add_provider(gtk_widget_get_style_context(window),
                                   GTK_STYLE_PROVIDER(cssProvider),
                                   GTK_STYLE_PROVIDER_PRIORITY_USER);

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_container_add(GTK_CONTAINER(window), label);
    gtk_widget_show_all(window);

    gtk_main();
}

以下是我的CSS代码,位于theme.css文件中,目前只会改变字体颜色:

GtkLabel {
    color: green;
}

我使用以下方式进行编译:

gcc `pkg-config gtk+-3.0 --cflags` test.c -o test `pkg-config --libs gtk+-3.0`

然而,当我运行代码时,文字是黑色的。如果我将theme.css更改为使用widget名称或CSS类而不是GtkLabel,则仍然无效。但是,如果我使用*而不是GtkLabel,则它可以工作(尽管我不希望这适用于所有内容)。这意味着C代码应该是正确的,CSS存在问题。

1
你正在忽略 gtk_css_provider_load_from_path() 的错误。使用最后一个参数;如果函数返回 FALSE,检查它以查看问题所在。我有一种感觉选择器不是 GtkLabel,而且你可能缺少了一个 ;... - andlabs
@andlabs 我添加了 ;(我的代码中有,只是问题中没有),并且我检查了返回值。它是 true。 - gsgx
嗯...尝试将样式提供程序添加到标签的样式上下文中,而不是窗口的。 - andlabs
@andlabs 那个方法可行!但如果我能有一个CSS文件,用于窗口及其所有子元素,而不是每个部件都有一个CSS文件,那就更好了。 - gsgx
你可以这样做:只需要为CSS选择器添加更高的具体性。尝试使用CSS类而不是使用部件名称,并使用gtk_style_context_add_class()添加相同的类。 - ebassi
如果我理解正确的话,.label 类应该已经被定义了,所以如果我使用这个类,就不需要调用 gtk_style_context_add_class。但是使用这个类而不是 GtkLabel 也不起作用。 - gsgx
1个回答

11

目前,CSS提供程序不会被继承到子样式上下文中。因此,您需要使用gtk_style_context_add_provider_for_screen()将CSS提供程序添加到屏幕。

尝试更改

gtk_style_context_add_provider(gtk_widget_get_style_context(window),
                               GTK_STYLE_PROVIDER(cssProvider),
                               GTK_STYLE_PROVIDER_PRIORITY_USER);

gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
                                          GTK_STYLE_PROVIDER(cssProvider),
                                          GTK_STYLE_PROVIDER_PRIORITY_USER);

我认为目前的gtk不支持多屏幕,但是可以使用gtk_widget_get_screen()代替gdk_screen_get_default()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接