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

