繁体   English   中英

交换gtk文本字段中的背景色(gtkmm C ++)

[英]swapping background colors in gtk text field (gtkmm C++)

在我的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方式。

您可以删除CSS,而只需使用override_background_color (标准的GTK小部件方法)即可:

override_background_color (StateFlags state, RGBA color)

设置要用于小部件的背景颜色。

所有其他样式值均保持不变。

注意:此API主要是作为应用程序更改小部件外观的快速方法。 如果您正在开发小部件库并且希望使此更改具有主题性,那么最好通过add_classadd_region在小部件/容器实现中设置有意义的CSS类和区域来完成。

这样一来,你的控件库可以安装一个CssProviderSTYLE_PROVIDER_PRIORITY_FALLBACK为了优先提供的默认样式为那些需要这样的小部件,而这种主题化可以由用户的主题完全覆盖。

注意:请注意,对于复杂的窗口小部件,这可能会带来不想要的结果(例如,各处的背景颜色均相同),在这种情况下,最好通过具有STYLE_PROVIDER_PRIORITY_APPLICATION优先级的CssProvider完全对此类窗口小部件进行样式STYLE_PROVIDER_PRIORITY_APPLICATION

参数:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM