【发布时间】:2016-12-05 05:29:37
【问题描述】:
我想使用gtk-rs bindings 创建包含ComboBoxes 的TreeView 程序。
为了获得GtkCellRendererCombo 的数据,我需要GtkTreeModel *,但我不知道如何在ListStore 中添加ListStore。
目前我只有一个简单的TreeView。我想要一个 ComboBox 在 1 列内(标题“f64”):
extern crate gtk;
use gtk::prelude::*;
use gtk::{ComboBox, ListStore, Orientation, TreeView, TreeViewColumn, Window, WindowType};
fn main() {
gtk::init().expect("Failed to initialize GTK");
let window = Window::new(WindowType::Toplevel);
window.set_position(gtk::WindowPosition::Center);
window.set_title("Rust>K+3");
window.set_position(gtk::WindowPosition::Center);
window.connect_delete_event(|wind, _| {
let (szerokosc, wysokosc) = wind.get_size();
println!("Width {} Height {}", szerokosc, wysokosc);
// Stop the main loop.
gtk::main_quit();
// Let the default handler destroy the window.
Inhibit(false)
});
let main_box = gtk::Box::new(Orientation::Vertical, 0);
let view_list = TreeView::new();
{
let types_inside_columns = &[gtk::Type::U32, gtk::Type::F64];
let model_list_of_data = ListStore::new(types_inside_columns);
for liczba in 0..10 {
let array_of_data = [&(liczba.to_value()) as &ToValue,
&((liczba as f64 * 1.5).to_value()) as &ToValue];
model_list_of_data.insert_with_values(None, &[0, 1], &array_of_data);
}
view_list.set_model(Some(&model_list_of_data));
let object_to_render_cells: gtk::CellRendererText = gtk::CellRendererText::new();
object_to_render_cells.set_visible(true);
let view_column = TreeViewColumn::new();
view_column.set_expand(true);
view_column.set_visible(true);
view_column.set_title("u32");
view_column.pack_start(&object_to_render_cells, true);
view_column.add_attribute(&object_to_render_cells, "text", 0);
view_list.append_column(&view_column);
// second column
let object_to_render_cells_2: gtk::CellRendererText = gtk::CellRendererText::new();
object_to_render_cells_2.set_visible(true);
let view_column_2 = TreeViewColumn::new();
view_column_2.set_expand(true);
view_column_2.set_visible(true);
view_column_2.set_title("f64");
view_column_2.pack_start(&object_to_render_cells, true);
view_column_2.add_attribute(&object_to_render_cells, "text", 1);
view_list.append_column(&view_column_2);
}
view_list.expand_all();
main_box.add(&view_list);
window.add(&main_box);
window.show_all();
gtk::main();
}
我已经尝试将gtk::Type:BaseBoxed添加到types_inside_columns,然后将一个装箱的ListStore添加到array_of_data,但是Box无法通过方法to_value()成功转换为类型ToValue。
添加: 该程序在运行时出现恐慌:
extern crate gtk;
use gtk::prelude::*;
use gtk::{ComboBox, ListStore, Orientation, TreeView, TreeViewColumn, Window, WindowType};
fn main()
{
gtk::init().expect("Failed to initialize GTK");
let window = Window::new(WindowType::Toplevel);
window.set_position(gtk::WindowPosition::Center);
window.set_title("Rust>K+3");
window.set_position(gtk::WindowPosition::Center);
window.connect_delete_event(|wind, _| {
let (szerokosc,wysokosc) = wind.get_size();
println!("Width {} Height {}",szerokosc,wysokosc);
// Stop the main loop.
gtk::main_quit();
// Let the default handler destroy the window.
Inhibit(false)
});
let main_box = gtk::Box::new(Orientation::Vertical,0);
let view_list = TreeView::new();
{
let types_inside_columns = &[gtk::Type::U32,gtk::Type::F64,gtk::Type::Pointer];
let model_list_of_data = ListStore::new(types_inside_columns);
for liczba in 0..10 {
let model_for_combo = ListStore::new(types_inside_columns);
let array_of_data = [&(liczba.to_value()) as &ToValue,
&((liczba as f64 * 1.5).to_value()) as &ToValue,
];
let typ_iter = model_list_of_data.insert_with_values(None,&[0,1],&array_of_data);
model_list_of_data.set_value(&typ_iter,2, &model_for_combo.to_value() as >k::Value);
}
view_list.set_model(Some(&model_list_of_data));
let object_to_render_cells : gtk::CellRendererText = gtk::CellRendererText::new();
object_to_render_cells.set_visible(true);
let view_column= TreeViewColumn::new();
view_column.set_expand(true);
view_column.set_visible(true);
view_column.set_title("u32");
view_column.pack_start(&object_to_render_cells,true);
view_column.add_attribute(&object_to_render_cells,"text",0);
view_list.append_column(&view_column);
//second column
let object_to_render_cells_2 : gtk::CellRendererCombo = gtk::CellRendererCombo::new();
let view_column_2 = TreeViewColumn::new();
view_column_2.set_expand(true);
view_column_2.set_visible(true);
view_column_2.set_title("f64");
view_column_2.pack_start(&object_to_render_cells_2,true);
view_column_2.add_attribute(&object_to_render_cells_2,"text",1);
view_list.append_column(&view_column_2);
}
view_list.expand_all();
main_box.add(&view_list);
window.add(&main_box);
window.show_all();
gtk::main();
}
【问题讨论】:
标签: combobox rust gtk3 treemodel rust-gnome