Почему стилизация виджетов gtk css не работает? - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь стилизовать виджет изнутри его конструктора в 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 или назначая его классу, думал, что я все еще не могу стилизовать его для детей.Приоритеты, кажется, ничего не меняют, добавление глобальных стилей «flowbox» для контекста экрана тоже не работает.

Я пытался сделать это с помощью инспектора gtk, но и здесь ничего не получилось.

Так как же стилизовать все дочерние элементы виджета?Или мне нужно указать класс для них?

1 Ответ

0 голосов
/ 25 мая 2018

Вот рабочий пример:

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 похоже не работает.

...