Rust使用FLTK开发时如何将界面绘制逻辑封装为可调用函数
问题原因及解决方法
你代码的问题主要出在参数定义错误、FLTK控件添加流程不符合规则两个部分,按下方步骤修改即可:
1. 修正wallet_add函数的定义和内部逻辑
你当前的函数参数语法写反了,Rust的函数参数规则是参数名: 类型,同时需要遵循FLTK的控件添加顺序:父容器先调用begin()进入编辑状态,加完全部子控件后再调用end(),最后重绘。
修改后的函数代码如下:
// 注意提前导入依赖: // use fltk::window::Window; // use fltk::group::Group; // use fltk::frame::FrameType; // use fltk::enums::Color; pub fn wallet_add(winw: &mut Window) { println!("in wallet trans"); // 主窗口进入可添加控件状态 winw.begin(); // 初始化Group let mut wall_group = Group::new(50, 90, 500, 300, "Wallet Data Add/Change/Delete"); // 给Group添加所有子控件 let wall_name = fltk::input::Input::new(180, 105, 170, 20, "Wallet Name:"); wall_group.add(&wall_name); let wall_username = fltk::input::Input::new(180, 130, 170, 20, "Wallet Username:"); wall_group.add(&wall_username); let wall_password = fltk::input::Input::new(180, 155, 170, 20, "Wallet Password:"); wall_group.add(&wall_password); let btn_wall_add = fltk::button::Button::new(180, 190, 60, 20, "Add"); wall_group.add(&btn_wall_add); let btn_wall_delete = fltk::button::Button::new(260, 190, 60, 20, "Delete"); wall_group.add(&btn_wall_delete); // 完成Group子控件添加 wall_group.end(); // 设置Group样式 wall_group.set_frame(FrameType::FlatBox); wall_group.set_color(Color::by_index(2)); // 把Group加到主窗口 winw.add(&wall_group); // 结束主窗口的编辑状态 winw.end(); // 最后重绘窗口更新界面 winw.redraw(); }
2. 修正主函数中菜单回调的调用逻辑
FLTK的窗口类型是引用计数的智能指针,实现了Clone trait,你需要克隆窗口实例传递给回调,避免所有权冲突,修改后的菜单代码如下:
// 克隆窗口实例给第一个回调使用 let win_clone = win.clone(); menu.add( "Transactions/Wallet or Exchange", Shortcut::None, MenuFlag::Normal, move |_| { let mut win_mut = win_clone.clone(); wallet_add(&mut win_mut); }, ); // 后续其他菜单如果要用到窗口,也用同样的方式克隆即可 let win_clone2 = win.clone(); menu.add( "Transactions/Coins", Shortcut::None, MenuFlag::Normal, move |_| { // 你的业务逻辑 }, );
补充说明
你直接把代码复制到调用位置能正常运行,是因为直接写在主函数上下文时,FLTK会自动把新创建的控件关联到最近一次调用过begin()的父容器,不需要手动处理容器的编辑状态,封装到独立函数后上下文发生变化,就需要手动调用begin()/end()控制控件的父级关联。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

