我正在尝试在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);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了样式“ 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 ();
}
Run Code Online (Sandbox Code Playgroud)
编译:
valac --pkg gtk+-3.0 css_provider_example.vala
add_provider是该窗口小部件的提供者。add_provider_for_screen为应用程序中的所有小部件添加样式表。我可以理解的for_screen是,使某人认为它适用于该屏幕上的所有应用程序可能会产生误导,但据我所知并非如此。
我已将该add_provider_for_screen部分移至该main ()块以阐明它是针对整个应用程序的。如果您希望样式仅适用于es GtkLabel内部的s,GtkFlowBox则选择器GtkFlowBox GtkLabel应该起作用。
同样,术语“节点”和“选择器”似乎有些混乱。我必须label将GTK + CSS 更改为GtkLabel。“节点”可能是窗口小部件的一部分,它可能会受到CSS的影响,而不是受选择标识符的影响,但是任何澄清这一点将非常有帮助!我发现.label确实有效。因此label在CSS中被视为类名,而GtkLabel在元素中则被视为。注意前面的点label。.flowbox似乎不起作用。