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<_>
输入。
这是一个基于您发布的用于更改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() 函数访问另一个小部件的主要内容,如果未能解决你的问题,请参考以下文章