RUST + FLTK:从小部件 on_push() 函数访问另一个小部件
RUST + FLTK: accessing another widget from widget on_push() function
我用FLTK在里面创建了一个window和两个按钮,btn_A有一个回调,应该改变btn_B标签,但我没有看到任何非怪物的方法做这个,ples halp? =''[
fn main() {
showMainWindow();
}
pub fn showMainWindow() {
//WINDOW
let application=app::App::default();
let mut win = window::Window::default().with_size(500,300);
//BTN_A
let mut btn_A:Listener<_> = button::Button::new(100,100,100,50,"btn_A").into();
//BTN_B
let mut btn_B:Listener<_> = button::Button::new(300,100,100,50,"btn_B").into();
//BTN_A_CALLBACK
btn_A.handle(|elem,evt| match evt {
enums::Event::Push => { btn_A(elem); true }
_ => { false }
});
win.end();
win.show();
application.run().unwrap();
}
pub fn btn_A(elem:&mut button::Button) {
elem.deactivate(); //deactivate itself
//but how do I access btn_B here?
}
原则上,只需将对 btn_B
的可变引用传递给您的处理函数:
pub fn btn_A(elem:&mut button::Button, btn_B: &mut button::Button) {
...
}
但是您的代码有一个小问题:您将函数命名为与保存按钮的变量相同的名称。
除了最新版本的 fltk
crate(v.1.2.23,我使用它是因为你没有指定你在问题中使用的版本)似乎没有Listener<_>
类型。
这是一个基于您发布的用于更改 btn_B
标签的代码段的示例:
use fltk::{prelude::{WidgetExt, GroupExt, WidgetBase}, window, app, button, enums};
fn main() {
showMainWindow();
}
pub fn showMainWindow() {
//WINDOW
let application = app::App::default();
let mut win = window::Window::default().with_size(500, 300);
//BTN_A
let mut btn_A = button::Button::new(100, 100, 100, 50, "btn_A");
//BTN_B
let mut btn_B = button::Button::new(300, 100, 100, 50, "btn_B");
//BTN_A_CALLBACK
btn_A.handle(move |elem, evt| match evt {
enums::Event::Push => {
btn_A_click(elem, &mut btn_B);
true
}
_ => false,
});
win.end();
win.show();
application.run().unwrap();
}
pub fn btn_A_click(elem: &mut button::Button, btn_B: &mut button::Button) {
elem.deactivate(); //deactivate itself
//but how do I access btn_B here?
btn_B.set_label("New title.")
}
另请注意,由于 move
关键字,handle
闭包现在拥有 btn_B
的所有权。
我用FLTK在里面创建了一个window和两个按钮,btn_A有一个回调,应该改变btn_B标签,但我没有看到任何非怪物的方法做这个,ples halp? =''[
fn main() {
showMainWindow();
}
pub fn showMainWindow() {
//WINDOW
let application=app::App::default();
let mut win = window::Window::default().with_size(500,300);
//BTN_A
let mut btn_A:Listener<_> = button::Button::new(100,100,100,50,"btn_A").into();
//BTN_B
let mut btn_B:Listener<_> = button::Button::new(300,100,100,50,"btn_B").into();
//BTN_A_CALLBACK
btn_A.handle(|elem,evt| match evt {
enums::Event::Push => { btn_A(elem); true }
_ => { false }
});
win.end();
win.show();
application.run().unwrap();
}
pub fn btn_A(elem:&mut button::Button) {
elem.deactivate(); //deactivate itself
//but how do I access btn_B here?
}
原则上,只需将对 btn_B
的可变引用传递给您的处理函数:
pub fn btn_A(elem:&mut button::Button, btn_B: &mut button::Button) {
...
}
但是您的代码有一个小问题:您将函数命名为与保存按钮的变量相同的名称。
除了最新版本的 fltk
crate(v.1.2.23,我使用它是因为你没有指定你在问题中使用的版本)似乎没有Listener<_>
类型。
这是一个基于您发布的用于更改 btn_B
标签的代码段的示例:
use fltk::{prelude::{WidgetExt, GroupExt, WidgetBase}, window, app, button, enums};
fn main() {
showMainWindow();
}
pub fn showMainWindow() {
//WINDOW
let application = app::App::default();
let mut win = window::Window::default().with_size(500, 300);
//BTN_A
let mut btn_A = button::Button::new(100, 100, 100, 50, "btn_A");
//BTN_B
let mut btn_B = button::Button::new(300, 100, 100, 50, "btn_B");
//BTN_A_CALLBACK
btn_A.handle(move |elem, evt| match evt {
enums::Event::Push => {
btn_A_click(elem, &mut btn_B);
true
}
_ => false,
});
win.end();
win.show();
application.run().unwrap();
}
pub fn btn_A_click(elem: &mut button::Button, btn_B: &mut button::Button) {
elem.deactivate(); //deactivate itself
//but how do I access btn_B here?
btn_B.set_label("New title.")
}
另请注意,由于 move
关键字,handle
闭包现在拥有 btn_B
的所有权。