我有一些 GtkTextTable*mom_tagtable;
是 GtkTextBuffer *mom_obtextbuf;
的标签表(显示在两个 TextView 中 GtkWidget *mom_tview1;
& GtkWidget*mom_tview2;
)。我在 Linux/Debian/Sid 上使用 GTK3.21,它用于与 this other 中相同的(免费软件,GPLv3)应用程序问题:expjs branch (在 github
上)的 MELT 监视器。顺便说一句,所有 GTK 代码都在一个 C99 文件中 gui.c .我有几十个文本标签:
static GtkTextTag *mom_tag_toptitle; // tag for top text
static GtkTextTag *mom_tag_objtitle; // tag for object title line
static GtkTextTag *mom_tag_objsubtitle; // tag for object subtitle line
static GtkTextTag *mom_tag_idstart; // tag for first characters of objids
/* etc .... */
我不想使用 GtkBuilder
构建我的 GUI(我更喜欢手动编码,因为大部分代码稍后可以由我的应用程序生成)。我想在同一个文本文件中自定义标签和我所有应用程序的外观。似乎GTK CSS stylesheets可能会有用。
实际上,看起来 GTK3 已经或曾经有几种方法来描述文本文件中应用程序的外观和主题(GtkBuilder 也定义了 GUI,我不想拥有它,GTK-CSS stylesheets,过时了Gtk resource 文件,已过时的 GtkUIManager 等...)并且它正在过渡到 GTK CSS 框架,但过渡未在 GTK3.20 中完成。
我目前正在使用硬编码的外观和感觉来初始化这些标签:
mom_tag_toptitle =
gtk_text_buffer_create_tag (mom_obtextbuf,
"toptitle",
"justification", GTK_JUSTIFY_CENTER,
"pixels-above-lines", 2,
"pixels-below-lines", 4,
"foreground", "navy",
"paragraph-background", "lightyellow",
"font", "Helvetica Bold", "scale", 1.5, NULL);
mom_tag_objtitle =
gtk_text_buffer_create_tag (mom_obtextbuf,
"objtitle",
"justification", GTK_JUSTIFY_CENTER,
"pixels-above-lines", 4,
"pixels-below-lines", 2,
"foreground", "brown",
"font", "Sans Bold",
"paragraph-background", "lightcyan",
"scale", 1.3, NULL);
mom_tag_objsubtitle =
gtk_text_buffer_create_tag (mom_obtextbuf,
"objsubtitle",
"justification", GTK_JUSTIFY_CENTER,
"pixels-above-lines", 1,
"pixels-below-lines", 1,
"foreground", "chocolate4",
"font", "Sans Bold",
"paragraph-background", "lightgoldenrod",
"scale", 1.15, NULL);
mom_tag_idstart =
gtk_text_buffer_create_tag (mom_obtextbuf,
"idstart",
"font", "Courier Bold",
"foreground", "darkgreen", NULL);
我对这种方法不满意,我希望这些标签具有在某些外部文本文件中描述的外观(字体、大小、颜色)(同样适用于 TextView 周围的小部件)。
所以我的问题是:
如何通过 GTK CSS 样式表自定义 GtkTextTag
?
我正在考虑创建一些“假”GtkWidgetPath (我应该为每个 gtk 文本标签创建一个这样的路径)并使用它来检索 GTK CSS 中的样式信息,但我完全不确定这是正确的方法。
我也不明白为什么显示相同文本缓冲区的两个不同的 TextView 对于相同的文本可以有不同的样式(我希望这是不可能的,但我不确定为什么) .
This可能是一个相关的问题,但它看起来与我的完全不同。
附言。我并不特别关注 GTK3 CSS,但如果可能的话,我确实希望有一个描述我的整个 GTK3 应用程序外观的文本文件。
最佳答案
要回答我自己的问题,正如 Nominal Animal 在评论中所建议的那样,为了将来引用,不可能使用 CSS,但可以使用 UI 构建器(实际工作代码在 C++ 中并使用 GtkMM libgtkmm 和 GTK 3.22,即在我的 github melt-monitor master 分支 git commit d947aedc723913789515 )。确实使用(相当于 GtkMM 的)gtk_builder_new_from_file(传递 "browsermom.ui"
,这是下面的 XML GTK UI 文件的路径)来获取 GtkBuilder,使用 gtk_builder_get_object 从中获取 GtkTextTagTable
,使用 gtk_text_buffer_new 将其提供给 GtkTextBuffer
。
这是我正在使用的 XML GTK UI 文件 browsermom.ui
<?xml version="1.0" encoding="UTF-8"?>
<!-- file browsermom.ui for GtkBuilder describing tags in browsing textview -->
<!-- see also https://stackoverflow.com/q/39466395/841108 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<object class='GtkTextTagTable' id='browsertagtable_id'>
<!-- page_title_tag for the entire page -->
<child type="tag">
<object class='GtkTextTag'>
<property name="name">page_title_tag</property>
<property name="font">Arial Bold</property>
<property name="scale">1.35</property>
<property name="paragraph-background">lemonchiffon1</property>
<property name="pixels-above-lines">3</property>
<property name="pixels-below-lines">6</property>
<property name="foreground">navyblue</property>
<property name="justification">GTK_JUSTIFY_CENTER</property>
</object>
</child>
<!-- object_title_tag for start of object -->
<child type="tag">
<object class='GtkTextTag'>
<property name="name">object_title_tag</property>
<property name="font">Cabin Medium</property>
<property name="scale">1.27</property>
<property name="paragraph-background">cornsilk</property>
<property name="pixels-above-lines">2</property>
<property name="pixels-below-lines">3</property>
<property name="foreground">navyblue</property>
<property name="justification">GTK_JUSTIFY_CENTER</property>
</object>
</child>
<!-- etc.... --->
</object>
</interface>
(棘手的部分是理解 <child
XML 标记需要 type="tag"
XML 属性)
顺便说一句,出于某种我不明白的原因,我收到了类似 GTk 的警告
(monimelt:25323): Gtk-WARNING **: Failed to set property gtkmm__GtkTextTag.scale to O.9: Could not parse double 'O.9'
即使 0.9
没有出现在该文件中。
关于通过 GTK3 CSS 样式表自定义 GtkTextTag 外观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39466395/