В моем графическом интерфейсе (C++, GTKMM 3) у меня есть текстовое поле, которое предоставляет некоторую информацию о состоянии. я хотел бы изменить цвет фона этого поля (вместе с текстом, что я могу легко сделать), в зависимости от статуса.
не так много информации о том, как это сделать с GTKMM 3.X. я знаю, что мне нужно использовать класс CssProvider, и нашел несколько примеров того, как загрузить его в программу. но примеры показывают, как установить свойства один раз.
но я не понял, как я могу использовать свойства CSS для изменения цвета фона в зависимости от состояния (а не состояния, как в «зависании» или что-то в этом роде. я хочу иметь возможность поменять местами фон с красного на зеленый, когда захочу). если CSS написан с точки зрения использования имени виджета или типа виджета, как вы обрабатываете изменяющееся состояние виджета, чтобы изменить его свойства?
если у кого-то есть какие-либо подсказки или он знает какие-либо примеры, мне действительно может понадобиться помощь. цель этого состоит в том, чтобы дать пользователю немедленную обратную связь с первого взгляда. в спешке им не нужно будет читать статус ящика (или на расстоянии). цвет позволит им оценить, что происходит с первого взгляда.
Добавление кода
это то, что я пробовал до сих пор (сжато):
std::string style_sheet = ".red_bg {background: #FF0000; color: #000000; } ";
style_sheet += ".green_bg {background: #33FF33; color: #000000; }";
Glib::RefPtr<Gtk::StyleContext> stylecontext = my_text_field->get_style_context();
Glib::RefPtr<Gtk::CssProvider> cssprov = Gtk::CssProvider::create();
cssprov->load_from_data(style_sheet);
stylecontext->add_provider(cssprov, GTK_STYLE_PROVIDER_PRIORITY_USER);
stylecontext->add_class("red_bg");
stylecontext->context_save();
так что работает. когда программа запускается, я получаю текстовую запись с красным фоном.
но позже, если я сделаю следующее, ничего не произойдет:
Glib::RefPtr<Gtk::StyleContext>stylecontext = my_text_field->get_style_context();
stylecontext->remove_class("red_bg");
stylecontext->context_save(); // probably not necessary
stylecontext->add_class("green_bg");
stylecontext->context_save();
в этот момент фон остается красным. нет перехода от красного к зеленому. я видел предложения использовать функцию override_background_color в объекте GtkWidget, но это не работает. это только изменяет цвет, который используется, когда вы выделяете текст в виджете. я все еще хотел бы, чтобы это было сделано с помощью CSS.
override_background_color([args])
) - person Andrey Atapin   schedule 05.09.2012