gpt4 book ai didi

combobox - 如何在 Rust 的 gtk-rs 绑定(bind)中的 ListStore 中添加 ListStore?

转载 作者:行者123 更新时间:2023-11-29 08:16:40 28 4
gpt4 key购买 nike

我想用包含 ComboBoxes 的 TreeView 使用 gtk-rs bindings 创建程序.

为了获得GtkCellRendererCombo的数据,我需要一个GtkTreeModel *,但我不知道如何添加一个ListStoreListStore 中。

现在我只有一个简单的TreeView。我想要 1 列内的 ComboBox(标题“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&GTK+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

添加:该程序在运行时出现 panic :

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&GTK+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 &gtk::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();
}

最佳答案

类型问题

如果你想在另一个gtk::ListStore中存储一个gtk::ListStore,你不需要指定gtk::Type::Pointer,你需要使用最后一个变体,gtk::Type::Other(usize) .您可以使用 ToValue::to_value_type 获取 gtk::ListStore 的类型在运行时。遗憾的是,随着类型号的变化,我找不到在编译时执行此操作的方法。

let model = ListStore::new(&[Type::U8]);
println!("{:?}", model.to_value_type()); // Other(139977306752544)
println!("{:?}", model.to_value()); // Value(((GtkListStore*) 0x7f4f01b9a060))
// get type at runtime
let liststore_type = model.to_value_type();
let model = ListStore::new(&[Type::U32, Type::F64, liststore_type]);

现在您可以使用 ToValue::to_value 插入您的子模型。

使用gtk::CellRendererCombo

但是,您写道您想要在一行中使用组合框,可能用于编辑数字。为此,您不需要嵌套的 gtk::ListStore。您需要一个用于 gtk::TreeView 的模型和另一个用于选项的模型。

let model_list_of_data = ListStore::new(&[gtk::Type::U32, gtk::Type::String]);
let model_for_combo = ListStore::new(&[gtk::Type::String]);


for liczba in 0..10 {
let integer = liczba.to_value();
let float = format!("{}", liczba as f64 * 1.5).to_value();

model_list_of_data.insert_with_values(None, &[0, 1], &[&integer, &float]);
model_for_combo.insert_with_values(None, &[0], &[&float]);
}

// code for first column not changed

let object_to_render_cells_2: gtk::CellRendererCombo = gtk::CellRendererCombo::new();
object_to_render_cells_2.set_visible(true);
object_to_render_cells_2.set_property_editable(true);
// use the combo model for the options
object_to_render_cells_2.set_property_model(Some(&model_for_combo.upcast()));
// display the options of the first column in the combo model
object_to_render_cells_2.set_property_text_column(0);
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, false);
// the data for each row is in the second column in the tree model
view_column_2.add_attribute(&object_to_render_cells_2, "text", 1);
view_list.append_column(&view_column_2);

您可能已经注意到我使用字符串而不是普通 float 。这有两个原因:

  1. 使用format!,输出中不包含不必要的零
  2. 对于普通 float ,gtk 将显示组合,但如果您单击其中一个,则会崩溃

screenshot

关于combobox - 如何在 Rust 的 gtk-rs 绑定(bind)中的 ListStore 中添加 ListStore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38676739/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com