C语言 如何使用gtk_label_set_attributes改变GtkLabel的文本大小?



我有这个:

GtkWidget *const Label = gtk_label_new("Welcome");
gtk_label_set_attributes((GtkLabel *)Label, ({
PangoAttrList *const Attrs = pango_attr_list_new();
pango_attr_list_insert(Attrs, pango_attr_size_new(36));
Attrs;
}));
gtk_container_add((GtkContainer *)Window, Label);

我试图改变GtkLabel的文本大小,而不使用某种需要解析的标记语言

<标题>

当前结果:不显示任何文本

<标题>

预期结果:文本显示为使用gtk_label_set_markup("<span font="36">Welcome</span>");

我该怎么做?

<标题>

更新:下面使用显示文本:

GtkWidget *const Label = gtk_label_new(GameDirStr+2);
PangoAttrList *const Attrs = pango_attr_list_new();
PangoAttribute *const SizeAttr = pango_attr_size_new(72*PANGO_SCALE);
pango_attr_list_insert(Attrs, SizeAttr);
// pango_attribute_destroy(SizeAttr); // SEGFAULT
gtk_label_set_attributes((GtkLabel *)Label, Attrs);
pango_attr_list_unref(Attrs); // WORKS
pango_attribute_destroy(SizeAttr); // SEGFAULT even after the attributes were added to the label
gtk_container_add((GtkContainer *)Window, Label);

,文档说明我最终应该使用pango_attribute_destroy()释放它们,但是这样做会导致段错误,即使在我将它们添加到列表

之后如何正确地释放它们?

使用Pango属性更改文本大小的过程还包括预期的实践,例如释放内存

但是文档声明我最终应该使用pango_attribute_destroy()释放它们,但是这样做会导致段错误,即使我将它们添加到列表

如何正确地释放它们?

你不必这么做。属性列表拥有传递给pango_attr_list_insert()的属性参见文档(PangoAttribute *attr[transfer full])。所以你不再拥有PangoAttribute,除非你添加额外的引用。另外,请参阅相关的gi文档

我认为属性应该是pango字体描述符。您可以设置大小、家庭等,然后将其添加到属性列表中。请看下面的代码:

attrlist = pango_attr_list_new();
PangoFontDescription * font_desc = pango_font_description_new();
pango_font_description_set_size(font_desc, 36 * PANGO_SCALE);
PangoAttribute * attr = pango_attr_font_desc_new(font_desc);
pango_attr_list_insert(attrlist, attr);
gtk_label_set_attributes((GtkLabel *) Label, attrlist);

有一个大问题:

在属性被添加到标签后销毁它们。尝试将属性设置为NULL的标签将导致分割错误。

所以,简而言之,创建属性,创建列表,将属性添加到列表,将属性列表设置为标签,使用attribute destroy删除属性,使用pango list unref删除列表。

关于使用pango_attribute_destroy(),我发现答案是不这样做,因为pango_attr_list_unref()将自动释放列表中包含的任何属性

将给定属性列表的引用计数减少1。如果结果为零,则释放属性列表及其包含的属性.

相关内容

  • 没有找到相关文章

最新更新