我正在尝试学习Rust和Fltk gui库。我看到一个小的gui应用程序示例here,它工作得很好。下面是main
fn:
fn main() {
let a = app::App::default().with_scheme(app::Scheme::Gtk);
let mut win = window::Window::default().with_size(500, 300);
let mut form = Form::default();
form.register_default_callback();
win.end();
win.make_resizable(true);
win.show();
win.resize_callback(move |_, _, _, w, h| form.resize(0, 0, w, h));
a.run().unwrap();
}
我在这里看到form
Form没有显式添加到win
窗口。Form
是程序上部定义的结构:
struct Form {
grid : Grid,
name : input::Input,
age : input::IntInput,
occupation: input::Input,
btn : button::Button,
}
impl Form {
pub fn default() -> Self {
let mut grid = Grid::default_fill();
grid.set_layout(10, 5); // construct a new grid
let name = input::Input::default();
let age = input::IntInput::default();
let occupation = input::Input::default();
let btn = button::Button::default().with_label("Submit");
let mut g = Self {
grid,
name,
age,
occupation,
btn,
};
g.fill();
g
}
fn fill(&mut self) {
let grid = &mut self.grid;
grid.debug(false); // set to true to see cell outlines
let mut title = frame::Frame::default().with_label("Employee Form");
title.set_frame(enums::FrameType::FlatBox);
title.set_color(enums::Color::Red);
title.set_label_color(enums::Color::White);
grid.insert(
// insert widgets
&mut title, 0, 1..4
);
grid.insert(&mut frame::Frame::default().with_label("Name"), 2, 1);
grid.insert(&mut self.name, 2, 3);
grid.insert(&mut frame::Frame::default().with_label("Age"), 4, 1);
grid.insert(&mut self.age, 4, 3);
grid.insert(&mut frame::Frame::default().with_label("Occupation"), 6, 1);
grid.insert(&mut self.occupation, 6, 3);
grid.insert(&mut self.btn, 8, 2);
}
fn register_default_callback(&mut self) {
self.btn.set_callback({
let name = self.name.clone();
let age = self.age.clone();
let occupation = self.occupation.clone();
move |_| {
println!("Name: {}", name.value());
println!("Age: {}", age.value());
println!("Occupation: {}", occupation.value());
}
});
}
pub fn resize(&mut self, x: i32, y: i32, w: i32, h: i32) {
self.grid.resize(x, y, w, h); // determine how it's resized
}
}
只有同时具有win
和form
的行如下:
win.resize_callback(move |_, _, _, w, h| form.resize(0, 0, w, h));
但是,即使删除此行,应用程序也可以正常工作。Form
如何自动出现在窗口中?
2条答案
按热度按时间mgdq6dx11#
这是因为Form实际上并不是一个添加到窗口的小部件,它在Form::default中调用Grid::default_fill,然后将其添加到窗口。
ie3xauqp2#
这是因为FLTK的工作方式。当您创建一个容器(如
win
)时,随后创建的所有小部件都会自动添加到该容器中,直到您调用其end
方法。有关
Group
小部件的更多详细信息,请参阅the book。