+-
c – 具有许多自定义项的QListWidget性能
我有一个包含大约2500个自定义项目的列表.我用它们设置:

 const std::vector<const Items::AbstractItem *> results = _engine.request(text);
    if (!results.empty())
    {
        for (auto i : results){
            QListWidgetItem *lwi = new QListWidgetItem;
            _results->addItem(lwi);
            ListItemWidget *w = new ListItemWidget;
            w->setName(i->name());
            w->setTooltip(i->path());
            _results->setItemWidget(lwi, w);
        }
        _results->setFixedHeight(std::min(5,_results->count()) * 48); // TODO
        _results->show();
    }

这在i5-4590上大约需要5秒钟.隐藏窗口小部件的速度是原来的两倍.这是正常的还是我找错了?

最佳答案
我认为这是完全预期的行为,如Lists或Trees之类的控件,不基于任何数据模型.我相信数据模型的发明主要是为了解决这个问题.

在您的情况下,您有一个ListWidget控件,可以自己存储其数据.您需要在应用程序启动之前传递所有2500个项目,即使您的列表一次只显示10个项目,也需要执行此操作.即使您只是运行并关闭应用程序,用户也不会看到所有项目,但您仍需要将它们传递给ListWidget.一些GUI框架使用项目的内部分配,在这种情况下,他们可以稍微优化一下,如果你以块的形式分配你的项目,你可以做同样的事情,但它仍然不是一个好的解决方案.

现在让我们假设您介绍一些可以询问项目属性的对象.控件将询问某个项目,您的对象将响应内容.您的对象甚至不需要了解您的所有物品,只需在需要时学习.
你可以询问几个第一项,当它意识到它可以填满整个高度时停止.这样您就可以避免现在不需要的工作.控件还可以询问项目计数,因此可以设置其垂直滑块.

需要说的是,该模型不会自动解决您的问题,它只是一种编程范例,可以让您做得更好.

所以你的解决方案是用QListView替换你的QListWidget,并实现你自己继承QAbstractListModel的数据模型.您可以将结果传递给模型,并在需要时传递项目数据.

点击查看更多相关文章

转载注明原文:c – 具有许多自定义项的QListWidget性能 - 乐贴网