我有这个:
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。如果结果为零,则释放属性列表及其包含的属性.