[英]How can I change button label within its own callback in FLTK?
我想在按下按鈕時更改按鈕的 label。 但是我收到了這個錯誤信息。
error[E0505]: cannot move out of `but` because it is borrowed
--> src/main.rs:24:22
|
24 | but.set_callback(move || but.set_label("PRESSED"));
| --- ------------ ^^^^^^^ --- move occurs due to use in closure
| | | |
| | | move out of `but` occurs here
| | borrow later used by call
| borrow of `but` occurs here
error: aborting due to previous error
代碼本身
1 use fltk::*;
2
3 fn main() {
4
5 let app = app::App::default().with_scheme(app::Scheme::Gleam);
6 let mut win = window::Window::default()
7 .with_pos(0, 0)
8 .with_size(300, 300)
9 .with_label("FLTK_Window");
10 let mut but = button::Button::default()
11 .with_pos(0, 0)
12 .with_size(100, 50)
13 .center_of(&win)
14 .with_label("BUTTON");
15 win.end();
16 win.show();
17
18 win.set_color(Color::Black);
19 but.set_color(Color::from_rgb(0, 100, 0));
20 but.set_label_color(Color::White);
21 but.set_label_type(LabelType::Normal);
22 but.set_callback(move || but.set_label("PRESSED"));
23 app.run().unwrap();
24 }
我該如何處理這類問題?
最簡單的解決方案是clone
but
在設置回調之前,然后將其移動到閉包中,如下所示:
use fltk::*;
fn main() {
let app = app::App::default().with_scheme(app::Scheme::Gleam);
let mut win = window::Window::default()
.with_pos(0, 0)
.with_size(300, 300)
.with_label("FLTK_Window");
let mut but = button::Button::default()
.with_pos(0, 0)
.with_size(100, 50)
.center_of(&win)
.with_label("BUTTON");
win.end();
win.show();
win.set_color(Color::Black);
but.set_color(Color::from_rgb(0, 100, 0));
but.set_label_color(Color::White);
but.set_label_type(LabelType::Normal);
but.clone().set_callback(move || but.set_label("PRESSED"));
app.run().unwrap();
}
除了 frankenapps answer,fltk 有一個重載的 set_callback 方法 (set_callback2),它使您可以訪問小部件的可變引用。
but.set_callback2(|b| b.set_label("PRESSED"));
如果需要,您還可以使用move
來捕獲外部變量。
更新:從 fltk-rs 1.0 版開始,set_callback 默認捕獲 &mut self。
but.set_callback(|b| b.set_label("PRESSED"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.