如何在egui中创建标签后修改其值及获取部件ID
问题1:标签内容修改后不更新的解决方法
你的代码核心问题是**label_text变量的生命周期错误**:它被定义在CentralPanel::show的外层(大概率是update函数内部),而egui的update函数每帧都会执行,每次执行都会重新初始化label_text为"Change this",导致你在do_stuff里修改的值在下一帧被覆盖,自然看不到更新。
正确的做法是把label_text作为App结构体的状态成员,让它在应用生命周期内持续存在:
- 定义包含状态的App结构体:
struct MyApp { label_text: String, } impl MyApp { fn new(_cc: &eframe::CreationContext<'_>) -> Self { Self { label_text: "Change this".to_string(), } } }
- 在
update函数中使用结构体的可变状态:
impl eframe::App for MyApp { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { ui.add(egui::Label::new(&self.label_text)); if ui.add(egui::Button::new("Press me")).clicked() { do_stuff(&mut self.label_text, ctx); } }); } }
你的do_stuff函数无需修改,只要确保传入的是App结构体中持续存在的label_text即可。
问题2:获取/指定egui部件的ID
egui采用声明式UI模式,和C++的命令式UI逻辑不同,但依然可以手动指定或获取部件的ID:
手动指定部件ID
大部分egui部件都提供.with_id_source()方法,你可以传入任意能生成唯一标识的值(字符串、数字、自定义结构体等)来指定ID:
// 用字符串作为ID来源 ui.add(egui::Label::new(&self.label_text).with_id_source("my_unique_label")); // 或者用Id类型直接指定 use egui::Id; ui.add(egui::Button::new("Press me").with_id(Id::new("custom_button_id")));
获取部件的ID
如果需要获取某个部件自动生成的ID,可以通过添加部件后返回的Response对象获取:
let response = ui.add(egui::Label::new("test")); let label_id = response.id; // 获取该Label的ID
注意事项
egui的ID主要用于持久化部件状态(比如折叠面板的展开状态)、响应全局事件等,由于是声明式UI,通常不需要像C++那样通过ID直接操作部件,而是通过修改App状态来驱动UI更新。
内容的提问来源于stack exchange,提问作者Lucien A. Jones
相关产品推荐
相关产品推荐

