замена цветов фона в текстовом поле gtk (gtkmm C++)

В моем графическом интерфейсе (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.


person jasonmclose    schedule 27.08.2012    source источник
comment
я понял, как изменить фон (используйте фон, а не цвет фона в файле css). но я не могу переключать цвета фона туда и обратно.   -  person jasonmclose    schedule 28.08.2012
comment
Можете ли вы поделиться частью кода, который у вас есть?   -  person alf    schedule 30.08.2012
comment
добавил основной план того, что у меня есть до сих пор.   -  person jasonmclose    schedule 30.08.2012
comment
Похоже, вы слишком все усложняете. Почему бы вам просто не использовать метод ввода текста, чтобы изменить его bg-цвет? (Если я правильно помню, override_background_color([args]))   -  person Andrey Atapin    schedule 05.09.2012


Ответы (1)


Вы можете отказаться от CSS и просто использовать override_background_color. , стандартный метод виджета GTK:

override_background_color (StateFlags state, RGBA color)

Устанавливает цвет фона для виджета.

Все остальные значения стиля остаются нетронутыми.

Примечание. Этот API в основном предназначен для быстрого изменения внешнего вида виджета приложениями. Если вы разрабатываете библиотеку виджетов и хотите, чтобы это изменение можно было использовать в качестве темы, это лучше сделать, установив значимые классы и области CSS в реализации вашего виджета/контейнера с помощью add_class и add_region.

Таким образом, ваша библиотека виджетов может установить CssProvider с приоритетом STYLE_PROVIDER_PRIORITY_FALLBACK, чтобы обеспечить стиль по умолчанию для тех виджетов, которые в этом нуждаются, и эта тематика может полностью переопределяться пользовательской темой.

Примечание. Обратите внимание, что для сложных виджетов это может привести к нежелательным результатам (например, везде одинаковый цвет фона), в этих случаях лучше полностью стилизовать такие виджеты через CssProvider с приоритетом STYLE_PROVIDER_PRIORITY_APPLICATION.

Параметры:

  • StateFlags state состояние, для которого устанавливается цвет фона
  • RGBA color цвет, который нужно назначить, или null, чтобы отменить эффект предыдущие звонки override_background_color
person tricasse    schedule 05.09.2012
comment
нет. это не будет работать в gtkmm3. см. мой пост здесь. вызов override_background_color в gtkmm3 изменяет цвет выделенного текста, а не цвет самого виджета. так не пойдет. - person jasonmclose; 05.09.2012
comment
я бы понизил голос, но у меня недостаточно баллов или что-то в этом роде (хромой). это не решение. - person jasonmclose; 05.09.2012