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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:48:13