Вот рабочий пример:
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
s внутри GtkFlowBox
es, тогда селектор GtkFlowBox GtkLabel
должен работать.
Также терминология 'node' и 'selector' кажется немного запутанной.Мне пришлось изменить label
в GTK + CSS на GtkLabel
.«Узел» - это, вероятно, часть виджета, на которую может воздействовать CSS, а не идентификатор для выбора, но любой, кто разъяснит это, будет очень полезен!Я обнаружил, что .label
работает.Так что label
обрабатывается как имя класса в CSS, а GtkLabel
как элемент.Обратите внимание на точку перед label
..flowbox
похоже не работает.