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

如何为egui应用定义全新FontFamily并指定组件使用?

问题描述

我已经成功尝试了egui官方文档中覆盖现有FontFamily(Proportional、Monospace)的示例,但这类示例仅聚焦于修改已有字体家族。我希望定义一个全新的字体家族成员,而非仅修改已有家族(比如添加my_font成员),同时想在特定组件(如TextEdit)中指定使用该自定义字体家族。

现有尝试的代码(仅覆盖已有家族):

let mut fonts = FontDefinitions::default();

// 安装自定义字体(支持非拉丁字符):
fonts.font_data.insert("my_font".to_owned(),
   FontData::from_static(include_bytes!("../../fonts/Ubuntu-Light.ttf"))); // 支持.ttf和.otf格式

// 将自定义字体设为Proportional家族的最高优先级:
fonts.families.get_mut(&FontFamily::Proportional).unwrap()
    .insert(0, "my_font".to_owned());

// 将自定义字体设为Monospace家族的最后回退:
fonts.families.get_mut(&FontFamily::Monospace).unwrap()
    .push("my_font".to_owned());

egui_ctx.set_fonts(fonts);

我想实现的效果是在FontFamily枚举中添加自定义成员,类似这样:

pub enum FontFamily {
    Proportional,
    Monospace,
    my_font, // 如何添加这个自定义成员?
    Name(Arc<str>),
}

并在组件中调用该自定义字体家族,例如:

ui.add(
    egui::TextEdit::singleline(&mut ss)
    .text_color(egui::Color32::LIGHT_RED)
    .font(egui::FontSelection::FontId(FontId::new(
        20.,
        egui::FontFamily::my_font, // 这里引用自定义家族
    ))),
);
解决方案

直接修改egui的FontFamily枚举不可行(除非fork并修改egui源码,这会带来额外维护负担)。实际上egui已提供FontFamily::Name变体来支持自定义字体家族,无需新增枚举成员,具体步骤如下:

1. 注册自定义字体并创建新家族

在FontDefinitions中,除了添加字体数据,还要为自定义字体创建独立的家族条目:

use egui::{FontDefinitions, FontData, FontFamily, FontId};

let mut fonts = FontDefinitions::default();

// 1. 添加自定义字体数据
let custom_font_name = "my_font";
fonts.font_data.insert(
    custom_font_name.to_owned(),
    FontData::from_static(include_bytes!("../../fonts/Ubuntu-Light.ttf")),
);

// 2. 创建全新字体家族,关联自定义字体
let custom_family_name = "my_custom_family";
fonts.families.insert(
    FontFamily::Name(custom_family_name.into()),
    vec![custom_font_name.to_owned()],
);

// 应用字体设置
egui_ctx.set_fonts(fonts);

2. 在组件中使用自定义字体家族

通过FontFamily::Name引用自定义家族,直接在组件中指定:

ui.add(
    egui::TextEdit::singleline(&mut ss)
        .text_color(egui::Color32::LIGHT_RED)
        .font(FontId::new(
            20.,
            FontFamily::Name("my_custom_family".into()),
        )),
);

补充说明

  • FontFamily::Name接收Arc<str>类型参数,普通字符串可直接用.into()方法转换。
  • 如果需要多个字体作为自定义家族的回退,只需在vec!中按顺序添加多个字体名称即可,egui会依次尝试加载。

内容的提问来源于stack exchange,提问作者black_hole_sun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:02:49