我正在try 减少具有很多行的ColumnView小部件的加载时间.引用自 gtk list widget documentation:

虽然短列表为模型中的每个项目实例化小部件不是问题,但一旦列表增长到数千或数百万个元素,这就变得不太可行了.正因为如此,视图仅创建有限数量的列表标题项,并通过将它们绑定到新项来回收它们.总体而言,视图试图使列表标题保持可用only for the items that can actually be seen on screen.

然而,在我的代码示例中,虽然回收(绑定、解除绑定)工作正常;但设置了205个项;而只有几个项可见:

use gtk::*;
use gtk::prelude::*;
use gtk::gio::ListStore;
use gtk::glib::BoxedAnyObject;

fn main() {
    let application = Application::builder().application_id("column.view.test").build();
    application.connect_activate(|application| {
        let list_store = ListStore::new(BoxedAnyObject::static_type());
        for i in 0..10000 {
            list_store.append(&BoxedAnyObject::new(i));
        }
        let column_view = ColumnView::builder().model(&NoSelection::new(Some(list_store))).build();
        let scrolled_window = ScrolledWindow::builder().child(&column_view).build();
        let item_factory = SignalListItemFactory::new();
        item_factory.connect_setup(|_, item| {
            let list_item = item.downcast_ref::<ListItem>().unwrap();
            list_item.set_child(Some(&Label::new(None)));
            println!("setup");
        });
        item_factory.connect_bind(|_, item| {
            let list_item = item.downcast_ref::<ListItem>().unwrap();
            list_item.child().and_downcast::<Label>().unwrap().set_label("a");
            println!("bind");
        });
        item_factory.connect_unbind(|_, _| { println!("unbind"); });
        item_factory.connect_teardown(|_, _| { println!("teardown"); });
        column_view.append_column(&ColumnViewColumn::builder().factory(&item_factory).build());
        ApplicationWindow::builder().application(application).child(&scrolled_window).build().present();
    });
    application.run();
}

如何只设置可见(或更多)的项目或硬编码量的项目,以减少小部件的加载时间?

推荐答案

很简单的答案是:你不能.我试着使用几个重量级的大型项目时,也遇到了同样的问题(例如,纹理编辑程序、WebKit View).小部件正在开发中,如果您确实认为需要创建自己的小部件,您可能需要创建自己的小部件.至少我就是这么做的.

Rust相关问答推荐

通用池类型xsx

Rust中的相互递归特性与默认实现

定义采用更高级类型泛型的性状

在铁 rust 中传递所有权

有没有可能让泛型Rust T总是堆分配的?

如何实现Serde::Ser::Error的调试

在文件链实施中绕过borrow 判断器

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

为什么实现特征的对象期望比具体对象有更长的生命周期?

std mpsc 发送者通道在闭包中使用时关闭

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

为什么Rust中无法推断生命周期?

Rust 程序中的内存泄漏

有什么办法可以追踪泛型的单态化过程吗?

Rust 中 Mutex<> 的深拷贝?

为什么 `tokio::join!` 宏不需要 Rust 中的 `await` 关键字?

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

在 Rust 中组合特征的不同方法是否等效?

有没有比多个 push_str() 调用更好的方法将字符串链接在一起?