为什么gtk css小部件样式不起作用?

为什么gtk css小部件样式不起作用?,gtk,gtk3,vala,Gtk,Gtk3,Vala,我试图在Vala中从它的构造函数内部设计小部件的样式,但我没有得到我想要的结果。以下是原始代码示例: public class MyWidget : Gtk.FlowBox { public MyWidget () { var css_provider = new Gtk.CssProvider (); try { css_provider.load_from_data ( """

我试图在Vala中从它的构造函数内部设计小部件的样式,但我没有得到我想要的结果。以下是原始代码示例:

public class MyWidget : Gtk.FlowBox {

    public MyWidget () {
        var css_provider = new Gtk.CssProvider ();
        try {
            css_provider.load_from_data (
                """
                label {
                    color: blue;
                }
                """
            );
            get_style_context ().add_provider (css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
        } catch (Error e) {
            message ("error");
        }
    }

    public void add_entry (string s) {
        var entry = new Gtk.Label (s);
        add (entry);
    }

}
我已经尝试了所有不同的样式“flowbox”、“flowboxchild”、“label”等,唯一有效的是GtkFlowbox中的每个元素都使用“*”或将其分配给一个类,但我仍然无法为其子元素设置样式。优先级似乎不会改变任何东西,为屏幕上下文添加全局“流框”样式也不起作用

我曾尝试使用gtk inspector进行检查,但在这里也没有结果


那么,我如何设置小部件的所有子项的样式呢?或者我需要为它们指定类吗?

下面是一个工作示例:

public class MyWidget : Gtk.FlowBox {

    public MyWidget () {
        this.add_entry ("default text");
    }

    public void add_entry (string s) {
        var entry = new Gtk.Label (s);
        add (entry);
    }

}

void main (string[] args) {
    Gtk.init (ref args);

    var window = new Gtk.Window ();
    window.destroy.connect (Gtk.main_quit);
    window.window_position = Gtk.WindowPosition.CENTER;
    window.set_default_size (300, 80);
    window.add (new MyWidget ());

    var css_provider = new Gtk.CssProvider ();
    try {
        css_provider.load_from_data (
            """
            GtkLabel {
                color: blue;
            }
            """
        );
        Gtk.StyleContext.add_provider_for_screen (
                                 Gdk.Screen.get_default (),
                                 css_provider,
                                 Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
                                 );
    } catch (Error e) {
        message ("error loading CSS provider");
    }

    window.show_all ();

    Gtk.main ();
}
编译时使用:

valac--pkg gtk+-3.0 css_提供程序_示例。vala

是仅用于该小部件的提供程序
add\u provider\u for\u屏幕
为应用程序中的所有小部件添加样式表。我可以理解,
for_screen
可能会让人觉得它适用于该屏幕上的所有应用程序,这有点误导人,但从我所知道的情况来看,情况并非如此

我已经将
add\u provider\u for\u屏幕
部分移动到
main()
块中,以澄清它是针对整个应用程序的。如果希望样式仅应用于
GtkFlowBox
es内的
GtkFlowBox
s,则选择器
GtkFlowBox GtkLabel
应该可以工作


此外,“节点”和“选择器”这两个术语似乎有点令人困惑。我不得不将GTK+CSS中的
标签更改为
GtkLabel
。“节点”可能是小部件中受CSS影响的部分,而不是用于选择的标识符,但是任何人澄清这一点都会非常有帮助!我发现
.label
确实有效。因此,
label
在CSS中被视为类名,
GtkLabel
被视为元素。注意
标签前的点
.flowbox
似乎不起作用。

所以gtk文档(valadoc和gnome网站)说css节点被命名为“flowbox”、“label”等有点误导。这太令人困惑了。谢谢你的回答,它终于起作用了。看起来GTK+3.20的情况发生了一些变化。我刚刚找到了博客文章和维基页面