如何在egui的TextEdit输入框中输入小数?
解决egui TextEdit无法输入小数的问题
你的代码之所以只能输入整数,核心原因是每次UI渲染时都会用当前value的字符串覆盖value_str:当你输入到一半的小数(比如3.),此时parse会失败,value保持原整数不变,下一帧value_str又被重置为整数的字符串,导致输入的小数点被清除,看起来像是无法输入小数。
解决方案1:保留用户输入的中间状态
把value_str作为组件的持久化状态变量,不再每次从value生成,仅在解析成功时更新value,解析失败时保留用户输入的内容(也可在失去焦点时做强制验证):
#[derive(Default)] struct MyApp { value: f32, value_str: String, } impl eframe::App for MyApp { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { let response = ui.text_edit_singleline(&mut self.value_str); // 内容变化时尝试解析 if response.changed() { if let Ok(parsed_value) = self.value_str.parse::<f32>() { self.value = parsed_value; } // 解析失败时不重置value_str,保留用户输入 } // 失去焦点时验证,若解析失败则恢复为当前value的字符串 if response.lost_focus() { match self.value_str.parse::<f32>() { Ok(parsed) => self.value = parsed, Err(_) => self.value_str = self.value.to_string(), } } ui.label(format!("当前值: {}", self.value)); }); } }
解决方案2:使用egui原生的DragValue组件
如果不需要纯文本输入的样式,egui自带的DragValue原生支持浮点数输入,无需手动处理解析和状态:
// value是f32类型 ui.add(egui::DragValue::new(&mut value).speed(0.1));
内容的提问来源于stack exchange,提问作者Jonzik
相关产品推荐
相关产品推荐

