1

我已经用 QStringList 初始化了 QCompleter。而这个字符串列表有超过 30,000 个条目。我已经在我的 ui 中连接到 Qlineedit。那里没有问题。问题在于,每当我在该 qlineedit 中输入内容时,您可能会猜到,建议弹出的速度非常慢,因为有超过 30,000 个条目。所以我想知道是否有其他方法可以提高性能?就像使用多线程或类似的东西。我是qt的新手,如果我在实施中犯了任何错误,我深表歉意。谢谢

编辑:我的问题与大型模型的 QCompleter问题不同,因为我没有使用 QComboBox,我使用的是 QLineEdit。

4

1 回答 1

4

您可以尝试的第一件事是使用排序QStringList的而不是未排序的。我不知道您将列表中的字符串放在哪里,但是如果您可以按排序顺序而不是未排序的顺序获取它们,那么您绝对应该尝试一下。然后,您可以使用或值在完成者上调用setModelSorting方法 - 这将允许您的完成者从线性搜索(O(n)复杂度)切换到二进制搜索(O(log(n))复杂度)。给定字符串列表的大小,最坏情况下的二进制搜索需要 11 次比较 (log(30000) ~= 10.3) 才能找到特定字符串,而线性搜索在最坏情况下需要 30000 次比较。QCompleter::CaseSensitivelySortedModelQCompleter::CaseInsensitivelySortedModel

这个建议可能对您不起作用,因为您无法在字符串列表中(或任何自定义QAbstractItemModel子类表示的任何其他数据结构)中按排序顺序获取数据。不幸的是,它似乎不QCompleter容易扩展,因为它setCompletionPrefix似乎触发在模型中搜索完成的方法不是虚拟的,因此您不能覆盖它以多态地工作。您可能需要自定义您尝试使用完成器的小部件,以便它使用具有高效搜索和数据结构的自定义完成逻辑,并且仅用于QCompleter保存已找到的候选者的小(和排序)列表。有一个例子做了一些类似的事情,所以它可能值得一试。

于 2018-02-26T11:01:27.217 回答