为什么 gtk css 小部件样式不起作用?
Why gtk css widget styling does not work?
我正在尝试从 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 中的每个元素或分配它的“*” class,以为我仍然无法为它的子项设置样式。优先级似乎没有任何改变,为屏幕上下文添加全局 "flowbox" 样式也不起作用。
我试过使用 gtk inspector 来做,但这里也没有结果。
那么我如何为小部件的所有子项设置样式?或者我需要为他们指定 class 吗?
这是一个工作示例:
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 ()
块以阐明它适用于整个应用程序。如果您希望样式仅应用于 GtkFlowBox
es 内的 GtkLabel
s,那么选择器 GtkFlowBox GtkLabel
应该可以工作。
另外,术语 'node' 和 'selector' 似乎有点混乱。我不得不将 GTK+ CSS 中的 label
更改为 GtkLabel
。 'node' 可能是小部件中可能受 CSS 影响的部分,而不是用于选择的标识符,但任何人澄清这一点都会非常有帮助!我发现 .label
确实有效。因此 label
在 CSS 中被视为 class 名称,而 GtkLabel
被视为元素。注意 label
之前的点。 .flowbox
不过似乎不起作用。
我正在尝试从 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 中的每个元素或分配它的“*” class,以为我仍然无法为它的子项设置样式。优先级似乎没有任何改变,为屏幕上下文添加全局 "flowbox" 样式也不起作用。
我试过使用 gtk inspector 来做,但这里也没有结果。
那么我如何为小部件的所有子项设置样式?或者我需要为他们指定 class 吗?
这是一个工作示例:
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 ()
块以阐明它适用于整个应用程序。如果您希望样式仅应用于 GtkFlowBox
es 内的 GtkLabel
s,那么选择器 GtkFlowBox GtkLabel
应该可以工作。
另外,术语 'node' 和 'selector' 似乎有点混乱。我不得不将 GTK+ CSS 中的 label
更改为 GtkLabel
。 'node' 可能是小部件中可能受 CSS 影响的部分,而不是用于选择的标识符,但任何人澄清这一点都会非常有帮助!我发现 .label
确实有效。因此 label
在 CSS 中被视为 class 名称,而 GtkLabel
被视为元素。注意 label
之前的点。 .flowbox
不过似乎不起作用。