问题描述
QCompleter
在大型数据集(大型模型)上的运行速度稍慢:当我开始在 QCombobox
中输入字符时,它会通过几秒钟来显示带有变体的自动完成弹出窗口, 当输入第二个字符 QCompleter
也不会对按键做出反应几秒钟.下一个字符工作正常.模型大小约为 100K 记录.是否可以提高 QCompleter
性能或在第二个或第三个输入符号后显示弹出窗口?有什么好的例子吗?
QCompleter
works slightly slow on large data sets (large models): when I start to input characters in QCombobox
it passes few seconds to show auto-complete popup with variants, when input 2nd char QCompleter
does not react on key press for few seconds as well. Next characters works fine. Model size is about 100K records. Is it possible to improve QCompleter
performance or show popup after 2nd or 3rd input symbol? Are there some good examples?
推荐答案
解决方案类似于:https://stackoverflow.com/a/33404207/630169 作为 QCompleter
也在其 popup()
中使用了 QListView
.因此,加速 QCombobox 的完整解决方案是:
Solution appears similar to this: https://stackoverflow.com/a/33404207/630169 as QCompleter
also uses QListView
in its popup()
. So full solution to speed-up QCombobox is:
void ComboboxTools::tweak(QComboBox *combo)
{
// For performance reasons use this policy on large models
// or AdjustToMinimumContentsLengthWithIcon
combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
// Improve combobox view performance
tweak((QListView *)combo->view());
// Improve combobox completer performance
tweak(combo->completer());
}
调整下拉菜单/弹出菜单(视图):
void ComboboxTools::tweak(QListView *view)
{
// Improving Performance: It is possible to give the view hints
// about the data it is handling in order to improve its performance
// when displaying large numbers of items. One approach that can be taken
// for views that are intended to display items with equal sizes
// is to set the uniformItemSizes property to true.
view->setUniformItemSizes(true);
// This property holds the layout mode for the items. When the mode is Batched,
// the items are laid out in batches of batchSize items, while processing events.
// This makes it possible to instantly view and interact with the visible items
// while the rest are being laid out.
view->setLayoutMode(QListView::Batched);
// batchSize : int
// This property holds the number of items laid out in each batch
// if layoutMode is set to Batched. The default value is 100.
// view->setBatchSize(100);
}
调整完成器:
void ComboboxTools::tweak(QCompleter *completer)
{
completer->setCaseSensitivity(Qt::CaseInsensitive);
// If the model's data for the completionColumn() and completionRole() is sorted
// in ascending order, you can set ModelSorting property
// to CaseSensitivelySortedModel or CaseInsensitivelySortedModel.
// On large models, this can lead to significant performance improvements
// because the completer object can then use a binary search algorithm
// instead of linear search algorithm.
completer->setModelSorting(QCompleter::CaseSensitivelySortedModel);
// Improve completer popup (view) performance
tweak((QListView *)completer->popup());
}
这篇关于用于大型模型的 QCompleter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!