我已经用QStringList初始化了QCompleter。这个字符串列表有30,000多个条目。我已经在用户界面中连接到Qlineedit。那里没有问题。问题在于,每当我在qlineedit中键入某些内容时,您可能就会猜到,建议的弹出速度非常慢,因为条目数超过30,000。所以我想知道是否还有其他方法可以改善性能?例如使用多线程或类似方法。我是qt的新手,如果执行中发生任何错误,我深表歉意。谢谢

编辑:
我的问题不同于这个问题QCompleter for large models,因为我没有使用QComboBox,而是在使用QLineEdit。

最佳答案

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

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

10-04 14:14