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
相关产品推荐
相关产品推荐

