Rust fltk开发:选中菜单项后Group组件无法显示问题求助
问题原因
你代码里的Group无法显示是三个常见的fltk-rs使用错误导致的:
- 你在
Wallets分支内创建的wall_group是局部变量,分支执行完成后变量生命周期结束直接被销毁,自然不会显示在界面上 - 你在添加子组件之前就调用了
wall_group.end(),fltk的Group调用end()后就会关闭组件添加状态,后续调用add()方法不会生效 - 动态添加完组件后没有主动触发窗口重绘,界面不会更新新增的内容
修复方案
- 不要在消息循环的分支内创建局部界面组件,建议在窗口初始化阶段就提前创建所有需要的Group,默认设置为隐藏状态,收到对应菜单消息时再把目标Group设置为显示、其他无关Group设置为隐藏即可,也可以用智能指针持有Group的所有权避免被提前销毁
- 调整Group的操作顺序:创建Group后默认处于
begin()状态,直接添加所有子组件,全部添加完成后再调用end() - 切换Group显示状态后调用主窗口的
redraw()方法刷新界面
示例调整后的核心代码:
// 窗口初始化阶段提前创建所有Group,设置为隐藏 let mut wall_group = fltk::group::Group::new(50, 90, 500, 300, "Wallet Data Add/Change/Delete"); wall_group.set_frame(FrameType::FlatBox); wall_group.set_color(Color::by_index(2)); let wall_name = fltk::input::Input::new(180, 105, 170, 20, "Wallet Name:"); let wall_username = fltk::input::Input::new(180, 130, 170, 20, "Wallet Username:"); let wall_password = fltk::input::Input::new(180, 155, 170, 20, "Wallet Password:"); let btn_wall_add = fltk::button::Button::new(180, 190, 60, 20, "Add"); let btn_wall_delete = fltk::button::Button::new(260, 190, 60, 20, "Delete"); wall_group.end(); wall_group.hide(); // 默认隐藏 main_win.show(); main_win.set_callback(move|_| { if app::event() == Event::Close { s.send(Message::Quit); } }); while app.wait() { use Message::*; if let Some(msg) = r.recv() { match msg { Preference => { println!("In Preference area"); // 隐藏其他Group,显示偏好设置对应的Group } Quit => { app.quit(); } Wallets => { println!("In Wallets area"); wall_group.show(); main_win.redraw(); // 主动刷新界面 } } } }
学习资料推荐
可以直接看fltk-rs官方自带的示例代码库,里面包含了多场景切换、多线程消息通信、菜单联动等各类场景的实现示例,覆盖了你当前的使用需求,另外官方文档里也对Group、消息循环等核心组件的使用规则做了详细说明。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

