您可以尝试的第一件事是使用排序QStringList
的而不是未排序的。我不知道您将列表中的字符串放在哪里,但是如果您可以按排序顺序而不是未排序的顺序获取它们,那么您绝对应该尝试一下。然后,您可以使用或值在完成者上调用setModelSorting方法 - 这将允许您的完成者从线性搜索(O(n)复杂度)切换到二进制搜索(O(log(n))复杂度)。给定字符串列表的大小,最坏情况下的二进制搜索需要 11 次比较 (log(30000) ~= 10.3) 才能找到特定字符串,而线性搜索在最坏情况下需要 30000 次比较。QCompleter::CaseSensitivelySortedModel
QCompleter::CaseInsensitivelySortedModel
这个建议可能对您不起作用,因为您无法在字符串列表中(或任何自定义QAbstractItemModel
子类表示的任何其他数据结构)中按排序顺序获取数据。不幸的是,它似乎不QCompleter
容易扩展,因为它setCompletionPrefix
似乎触发在模型中搜索完成的方法不是虚拟的,因此您不能覆盖它以多态地工作。您可能需要自定义您尝试使用完成器的小部件,以便它使用具有高效搜索和数据结构的自定义完成逻辑,并且仅用于QCompleter
保存已找到的候选者的小(和排序)列表。有一个例子做了一些类似的事情,所以它可能值得一试。