gpt4 book ai didi

c++ - Pango Span 文本中的新符号颜色

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:58 25 4
gpt4 key购买 nike

第一次海报; Stack Overflow 天使的长期崇拜者。

我在 Pango 控制的跨度文本中遇到颜色问题。

长版:
我正在更新一个旧的 UI 程序,它具有带有 GTK、XML(由 Glade 编写)和处理图形的 RC 样式表的 C++ 代码。我们的一些彩色标记文本是硬编码在 XML 中的。其中一些是在 C++ 代码中动态设置的。问题是,当程序在我们的旧系统上运行时,跨度文本引用为“绿色”的颜色显示为#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,这也是有道理的。


我可以将所有“绿色”实例替换为“#00FF00”,但如果我们想在未来更改颜色,我们将不得不重新经历整个过程。我更愿意通过样式表更改颜色,而不是嵌入到代码中。

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 color='MyNewColor'>Weather Manipulation Settings</span>

或者甚至可以创建一个应用特定属性的新标签,例如:

    <span><MyNewColor>Shark Tank pH Balance</MyNewColor></span>

但我怀疑这是可能的。

我尝试使用 pango_attr_type_register()、pango_attr_foreground_new() 和 friend ,但我无法弄清楚属性是如何工作的,如果它们甚至可以做我想做的事情。经过大量研究,“属性”似乎只是对单个文本字符串的一次性设置。而不是像我希望的那样可以根据跨度文本调用的新值。

在不重建整个 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

最佳答案

如果您能够使用 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 中的工作方式 future 。

关于c++ - Pango Span 文本中的新符号颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38406515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com