尝试从 GTK-RS 应用程序的事件处理程序中添加到 `gtk::ListBox` 时,似乎没有任何反应
Seemingly nothing happens when attempting to add to a `gtk::ListBox` from within an event handler in GTK-RS application
我正试图从不相关的小部件的事件处理闭包中添加到 gtk::ListBox
容器。有问题的列表框是通过 gtk::Builder
获取的,如下所示:
let notes_list: gtk::ListBox = builder.get_object(NOTES_LIST_BOX_ID).unwrap();
以及我似乎无法添加到 notes_list
的事件处理程序(请注意,我尝试过不使用 clone!
宏,使用强引用和弱引用,包装在 Rc
指针等,但似乎没有任何变化):
open_menu_item.connect_activate(clone!(@strong state, @strong notes_list => move |_| {
println!("Open database menu item activated");
// Seemingly can't add to notes_list from within this closure???
notes_list.add(>k::Label::new(Some("TEST"))); // Doesn't work???
let dialog = gtk::FileChooserDialog::with_buttons::<gtk::Window>(
Some("Open database file"),
None,
gtk::FileChooserAction::Open,
&[("_Cancel", gtk::ResponseType::Cancel),
("_Open", gtk::ResponseType::Accept)]
);
dialog.connect_response(clone!(@weak state, @weak notes_list => move |this, res| {
if res == gtk::ResponseType::Accept {
let file = this.get_file().unwrap();
let path_buf = file.get_path().unwrap();
println!("Opening database file: {}", path_buf.as_path().display());
let mut state = state.borrow_mut();
state.db = database::database_in_file(path_buf.as_path()).ok();
state.update_notes_list(¬es_list);
}
this.close();
}));
dialog.show_all();
}));
没有出现错误消息 - 没有出现预期的行为(即向列表框中添加 gtk::Label
)。
该模块的完整代码(以及我的其他杂乱代码库):https://github.com/WiredSound/nos/blob/master/src/gui.rs
如果有人能帮我解决这个问题,我将不胜感激,谢谢。
在 GTK3 中,小部件默认情况下是隐藏的。这意味着在容器上调用 show_all()
将显示其所有 current children。如果您添加一个新的 child,您有责任对其调用 show()
以使其可见。
在您的信号处理程序中,您要将 gtk::Label
添加到列表框,但您还需要使其可见。
我正试图从不相关的小部件的事件处理闭包中添加到 gtk::ListBox
容器。有问题的列表框是通过 gtk::Builder
获取的,如下所示:
let notes_list: gtk::ListBox = builder.get_object(NOTES_LIST_BOX_ID).unwrap();
以及我似乎无法添加到 notes_list
的事件处理程序(请注意,我尝试过不使用 clone!
宏,使用强引用和弱引用,包装在 Rc
指针等,但似乎没有任何变化):
open_menu_item.connect_activate(clone!(@strong state, @strong notes_list => move |_| {
println!("Open database menu item activated");
// Seemingly can't add to notes_list from within this closure???
notes_list.add(>k::Label::new(Some("TEST"))); // Doesn't work???
let dialog = gtk::FileChooserDialog::with_buttons::<gtk::Window>(
Some("Open database file"),
None,
gtk::FileChooserAction::Open,
&[("_Cancel", gtk::ResponseType::Cancel),
("_Open", gtk::ResponseType::Accept)]
);
dialog.connect_response(clone!(@weak state, @weak notes_list => move |this, res| {
if res == gtk::ResponseType::Accept {
let file = this.get_file().unwrap();
let path_buf = file.get_path().unwrap();
println!("Opening database file: {}", path_buf.as_path().display());
let mut state = state.borrow_mut();
state.db = database::database_in_file(path_buf.as_path()).ok();
state.update_notes_list(¬es_list);
}
this.close();
}));
dialog.show_all();
}));
没有出现错误消息 - 没有出现预期的行为(即向列表框中添加 gtk::Label
)。
该模块的完整代码(以及我的其他杂乱代码库):https://github.com/WiredSound/nos/blob/master/src/gui.rs
如果有人能帮我解决这个问题,我将不胜感激,谢谢。
在 GTK3 中,小部件默认情况下是隐藏的。这意味着在容器上调用 show_all()
将显示其所有 current children。如果您添加一个新的 child,您有责任对其调用 show()
以使其可见。
在您的信号处理程序中,您要将 gtk::Label
添加到列表框,但您还需要使其可见。