第一次海报;长期以来对Stack Overflow天使的崇拜者。
我对跨度文本中由Pango控制的颜色存在问题。
长版:
我正在使用GTK,XML(由Glade编写)以及处理图形的RC样式表更新旧的UI程序,该程序具有C ++代码内容。我们的一些彩色标记文本在XML中是硬编码的。其中一些是在C ++代码中动态设置的。
问题是,当程序在我们的旧系统上运行时,span文本引用的颜色为' green'显示为#00FF00。在我们较新的系统上,'绿色'显示为#008000。
代码打印到标签小部件的示例:
gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='green'>Orbital Cannon Positioning</span>");
我非常确定Pango可以控制跨度文本标记。我发现绿色之间的区别正是X11和W3C颜色列表(https://en.wikipedia.org/wiki/X11_color_names#Clashes_between_web_and_X11_colors)之间的差异。 似乎我们的旧系统正在使用X11而我们的新系统正在使用W3C,这是有道理的。
我可以替换所有&#39; green&#39;用&#39;#00FF00&#39;但如果我们想改变未来的颜色,我们必须再次完成整个过程。我更倾向于通过样式表改变颜色,而不是将其烘焙到代码中。
C ++代码:
GtkWidget * TitleBarLabel;
TitleBarLabel = GTK_WIDGET (get_builder_object (builder, "TitleBarLabel"));
gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='#00FF00'>Death Ray Power Status</span>");
我可以在运行时创建GdkColor,并使用配置文件中的值创建gdk_color_parse,然后使用gtk_widget_modify_text()将颜色应用于标签小部件。但是,这对XML中的所有硬编码跨区文本都不起作用。此外,我们有很多标签,在同一行内有不同颜色的文本。
C ++代码:
GdkColor pass_color;
gdk_color_parse("#00FF00", &pass_color);
gtk_widget_modify_text(TitleBarLabel, GTK_STATE_NORMAL, &pass_color);
我可以在我的RC文件中为每种颜色创建一个样式,并链接在运行时使用该颜色的每个标签。但是我们必须删除所有标记着色并添加大量代码以获取我们以前从未打扰过的小部件以及用于设置小部件名称的代码,而不是仅使用新的跨文本打印它们。它得到了样式表中颜色可变的理想结果,但这是一项艰巨的任务,对于习惯使用颜色属性的资深工程师而言,这并不直观。
RC文件:
style "pass_color"
{
fg[NORMAL] = #00FF00
}
widget "*TitleBarLabel_Pass" style "pass_color"
C ++代码:
gtk_widget_set_name(TitleBarLabel, "TitleBarLabel_Pass");
简短版本:
理想情况下,我希望能够在运行时创建一个新颜色,我们可以在这样的派系中与span文本链接:
<span color='MyNewColor'>Weather Manipulation Settings</span>
或者甚至可以创建一个应用特定属性的新标记,例如:
<span><MyNewColor>Shark Tank pH Balance</MyNewColor></span>
但我怀疑这是可能的。
我尝试过使用pango_attr_type_register(),pango_attr_foreground_new()和朋友,但如果他们甚至可以做我认为他们做的事情,我也无法弄清楚属性是如何工作的。经过大量研究,它看起来像一个属性&#39;只是对单个文本字符串的一次性设置。而不是像我希望的那样可以根据span文本调用的新值。
如果没有重建所有Pango,这样的东西是否可以远程实现? 是否有不同的工作会让我得到像设置样式表? 在这一点上,我愿意接受建议。
版本规格:
计算机显示绿色为#00FF00
操作系统:Linux Slackware 13.37及以下
GTK:2.24.4
潘戈:1.28.4
显示绿色的计算机为#008000
操作系统:Linux Slackware 14.1
GTK:2.24.20
潘戈:1.34.1
答案 0 :(得分:0)
如果您能够使用GTK 3.x,我建议您这样做,使用CSS更容易。甚至有一种方法可以为同一标签中的不同区域使用多种CSS样式,尽管它很笨拙。
在GTK 2中,如您所述,您可以通过RC文件中的name
属性引用小部件:
widget "shark-tank-ph-label" style "green-text"
style "green-text" {
text[NORMAL] = #008000
}
我建议采用这种方法,即使它不是你习惯的。重构一次以从标签中删除硬编码颜色将使下次更改此类内容变得更加容易,并且如果您决定创建端口,还将使您的代码更接近GTK 3.x中的工作方式在将来。