为什么gtk css小部件样式不起作用?
我试图在Vala中从它的构造函数内部设计小部件的样式,但我没有得到我想要的结果。以下是原始代码示例:为什么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 ( """
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的情况发生了一些变化。我刚刚找到了博客文章和维基页面