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 的所有权。