为什么gtk css widget样式不起作用?

时间:2018-05-25 11:55:21

标签: gtk gtk3 vala

我正在尝试从Vala中的构造函数内部设置widget,但是我没有得到我想要的结果。这是原始代码示例:

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检查程序,但这里也没有结果。

那么如何为小部件的所有孩子设置样式?或者我需要为它们指定课程吗?

1 个答案:

答案 0 :(得分:5)

这是一个有效的例子:

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_provider_example.vala

add_provider仅是该小部件的提供者。 add_provider_for_screen为应用程序中的所有小部件添加样式表。我可以理解for_screen可能有点误导,因为有人认为它适用于该屏幕上的所有应用程序,但从我所知道的情况并非如此。

我已将add_provider_for_screen部分移至main ()块,以澄清它适用于整个应用程序。如果您希望该样式仅应用于GtkLabel es内的GtkFlowBox,则选择器GtkFlowBox GtkLabel应该有效。

术语“节点”和“选择器”似乎有点令人困惑。我不得不将GTK + CSS中的label更改为GtkLabel。 “节点”可能是可能受CSS影响的小部件的一部分,而不是选择的标识符,但任何澄清这将非常有帮助的人!我发现.label确实有效。因此,label被视为CSS中的类名称,GtkLabel就像元素一样。请注意label之前的点。 .flowbox似乎无法正常工作。