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

标签 gtk gtk3 vala

我正在尝试从 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 中的每个元素使用“*”或将其分配给一个类,我认为我仍然可以'风格它的 child 。优先级似乎没有任何改变,为屏幕上下文添加全局“flowbox”样式也不起作用。

我尝试使用 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_provider_example.vala

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

我已将 add_provider_for_screen 部分移至 main () block 以阐明它是针对整个应用程序的。如果您希望样式仅应用于 GtkFlowBoxes 内的 GtkLabel,则选择器 GtkFlowBox GtkLabel 应该可以工作。

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

关于gtk - 为什么 gtk css 小部件样式不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50528651/

相关文章:

c - 如何使用 GTK Notebook 向浏览器添加选项卡?

linux - 如何制作不捕获任何事件的叠加层

Python GTK 文件保存对话框,如何创建 "Close Without Saving"ResponseType

c - 无法使用 GTK3 更改光标

css - 我可以在 GTK3 主题中使用 Pixmap Engine 吗?

c - GTK3 更新菜单栏和菜单项

embedded-linux - 设备上没有剩余空间?

css - Evince 中的 GTK+ 插入符号颜色 CSS 属性

Vala 的模拟库

java - TLS-Package 后的神秘字节