You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GTK-4中如何让字体选择器打开时选中指定的Monospace Bold字体?

如何让GTK字体按钮默认选中Monospace Bold字体?

我用以下代码创建GTK字体按钮并尝试设置默认字体:

/* 实例化字体按钮 */
GtkWidget *font_button = gtk_font_button_new ();

/* 设置系统中已有的字体 */
gtk_font_chooser_set_font(GTK_FONT_CHOOSER(font_button),"Monospace Bold 12");

但打开字体选择器时,选中的是列表中的第一个字体,而非Monospace Bold。请问该如何实现默认选中Monospace Bold字体?

字体选择器界面

完整可运行示例

#include <gtk/gtk.h>
/* 编译命令:gcc `pkg-config --cflags gtk4` main.c `pkg-config --libs gtk4` */

void activate(GtkApplication *app, gpointer data) {
    GtkWidget *window = gtk_application_window_new(app);
    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);

    /* 实例化字体按钮 */
    GtkWidget *font_button = gtk_font_button_new ();

    /* 设置系统中已有的字体 */
    gtk_font_chooser_set_font(GTK_FONT_CHOOSER(font_button),"Monospace Bold 12");

    gtk_box_append(GTK_BOX(box), font_button);
    gtk_window_set_child(GTK_WINDOW(window), box);
    gtk_window_present(GTK_WINDOW(window));
}


int main(int argc, char *argv[]) {

    GtkApplication *app;

    app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    g_application_run (G_APPLICATION (app), argc, argv);
    g_object_unref(app);

    return 1;
}

解决方法

问题出在字体名称的匹配逻辑上,直接使用gtk_font_chooser_set_font传入字符串可能无法精准匹配系统中的字体条目。改用gtk_font_chooser_set_font_desc结合Pango字体描述对象可以解决这个问题,步骤如下:

  • 首先创建Pango字体描述对象,指定字体家族、样式和字号:
    PangoFontDescription *font_desc = pango_font_description_from_string("Monospace Bold 12");
    
  • 然后用该描述对象为字体选择器设置默认字体:
    gtk_font_chooser_set_font_desc(GTK_FONT_CHOOSER(font_button), font_desc);
    
  • 最后释放字体描述对象,避免内存泄漏:
    pango_font_description_free(font_desc);
    

修改后的activate函数代码:

void activate(GtkApplication *app, gpointer data) {
    GtkWidget *window = gtk_application_window_new(app);
    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);

    /* 实例化字体按钮 */
    GtkWidget *font_button = gtk_font_button_new ();

    /* 精确设置默认字体 */
    PangoFontDescription *font_desc = pango_font_description_from_string("Monospace Bold 12");
    gtk_font_chooser_set_font_desc(GTK_FONT_CHOOSER(font_button), font_desc);
    pango_font_description_free(font_desc);

    gtk_box_append(GTK_BOX(box), font_button);
    gtk_window_set_child(GTK_WINDOW(window), box);
    gtk_window_present(GTK_WINDOW(window));
}

这种方式利用Pango的字体匹配机制,能更可靠地定位到系统中的Monospace Bold字体,确保字体选择器默认选中目标字体。

内容的提问来源于stack exchange,提问作者9-Pin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:56:06