在我的 GUI(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();
此时,背景保持红色。没有从红色到绿色的过渡。我已经看到在 GtkWidget 对象中使用 override_background_color 函数的建议,但这不起作用。仅更改突出显示小部件中的文本时使用的颜色。我仍然希望看到它以 CSS 方式完成。