+-

我有一个包含大约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性能 - 乐贴网