RUST + FLTK:从小部件 on_push() 函数访问另一个小部件

Posted

技术标签:

【中文标题】RUST + FLTK:从小部件 on_push() 函数访问另一个小部件【英文标题】:RUST + FLTK: accessing another widget from widget on_push() function 【发布时间】:2021-12-23 06:27:24 【问题描述】:

我使用 FLTK 在里面创建了一个窗口和两个按钮,btn_A 有一个回调并且应该更改 btn_B 标签,但是我没有看到任何非怪异的方法可以做到这一点,请停下来? =''[

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?

【问题讨论】:

【参考方案1】:

原则上,只需将一个对btn_B 的可变引用传递给您的处理函数:

pub fn btn_A(elem:&mut button::Button, btn_B: &mut button::Button) 
    ...

但是,您的代码有一个小问题:您将函数命名为与保存按钮的变量相同。

除了最新版本的fltk crate(v.1.2.23,因为您没有指定您在问题中使用的版本),似乎没有Listener&lt;_&gt;输入。

这是一个基于您发布的用于更改btn_B标签的sn-p的示例:

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.")

另请注意,handle 闭包现在拥有 btn_B 的所有权,因为 move 关键字。

【讨论】:

感谢您的快速回复,非常感谢!是的,我的代码中有一些奇怪的时刻(使用 Listener<_> 和 .into() ),因为我从一些 youtube 教程中复制粘贴了它。在您的帮助下清理了一下,现在一切正常 虽然你可以尝试使用lazy_static crate 来引入一些全局变量,但我不推荐它。借用本质上是这些事情是如何在 rust 中完成的,我个人认为全局变量的风格相当糟糕。 哎呀,我之前的评论已经编辑了好几次了,但我明白了你的意思,谢谢,会努力改掉这个习惯

以上是关于RUST + FLTK:从小部件 on_push() 函数访问另一个小部件的主要内容,如果未能解决你的问题,请参考以下文章

fltk 小部件顺序,按钮隐藏在另一个小部件下

如何对 FLTK 中的小部件进行排序以使箭头键导航正常工作?

FLTK 绘图功能使用哪个原点?小部件还是窗口?

具有可编辑字段的 FLTK 选择小部件

从不同选项卡 FLTK 开始的线程中隐藏小部件

fltk-1.3.5 小部件上的视觉工件