【问题标题】:How do I change the text size of a GtkLabel using gtk_label_set_attributes?如何使用 gtk_label_set_attributes 更改 GtkLabel 的文本大小?
【发布时间】:2021-06-01 13:24:39
【问题描述】:

我有这个:

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);

但是documentation 声明我最终应该使用pango_attribute_destroy() 释放它们,但这样做会导致段错误,即使在我将它们添加到列表之后也是如此

如何正确释放它们?

使用Pango属性改变文本大小的过程还包括释放内存等预期做法

【问题讨论】:

    标签: c user-interface text label gtk


    【解决方案1】:

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

    如何正确释放它们?

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

    【讨论】:

    • 在多个标签上重复使用PangoAttrList 是否有效?
    • 我不知道。但根据GtkLabel 文档,属性可能会因其他原因而改变(比如某些属性更改,或者可能是悬停等状态更改?),所以最好不要重用
    【解决方案2】:

    我认为属性应该是 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);
    
    

    【讨论】:

    • 在这种情况下,pango_attr_size_new(36) 到底是什么?
    • 我发现我不需要字体描述,只要 pango_scale 就足够了
    • @user15318445 很高兴你知道了。如果你最终需要字体和东西 pango_font_description 会派上用场。作为记录,我将 gtkmm 用于 C++ 进行 gtk 开发,所以在 C 中看到 gtk 代码有点超出我的深度。我发现 GUI 元素等使用面向对象的方法效果更好。
    • 我明白了,我还有一个问题,我应该调用pango_attribute_destroy() 来释放内存,但是这样做会导致段错误,有什么想法吗?
    • @user15318445 段错误是由访问无效或越界地址引起的。确保您传递一个有效的地址。也就是说,确保您传递了一个指针(而不是一个值),并且该指针在范围内。如果将属性创建包装在函数或花括号中,则无法将其释放到外部。
    【解决方案3】:

    有一个大问题:

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

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

    【讨论】:

    • 我是按这个顺序做的,但是还是有段错误
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2011-10-06
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多