我如何优化 QCompleter 的性能?
How do i optimise performance of QCompleter?
我已经用 QStringList 初始化了 QCompleter。而这个字符串列表有超过 30,000 个条目。我已经在 ui 中连接到 Qlineedit。那里没有问题。问题在于,每当我在该 qlineedit 中键入内容时,正如您可能猜到的那样,弹出的建议非常缓慢,因为有超过 30,000 个条目。所以我想知道是否有其他方法可以提高性能?比如通过使用多线程或类似的东西。我是qt的新手,如果我在实施过程中犯了任何错误,我深表歉意。谢谢
编辑:
我的问题与这个问题 不同,因为我没有使用 QComboBox,我使用的是 QLineEdit。
您可以尝试的第一件事是使用已排序的 QStringList
而不是未排序的。我不知道你从哪里获取列表的字符串,但如果你可以按排序顺序而不是未排序的顺序获取它们,你一定要尝试一下。然后你就可以调用 setModelSorting method on the completer with QCompleter::CaseSensitivelySortedModel
or QCompleter::CaseInsensitivelySortedModel
value - that would allow your completer to switch from linear search (O(n) complexity) to binary search (O(log(n))复杂性)。给定字符串列表的大小,最坏情况下的二分搜索需要 11 次比较 (log(30000) ~= 10.3) 才能找到特定字符串,而线性搜索在最坏情况下需要 30000 次比较。
此建议可能对您不起作用,因为您无法在字符串列表中按排序顺序获取数据(或进入由任何自定义 QAbstractItemModel
子类表示的任何其他数据结构) .不幸的是,QCompleter
似乎不容易扩展,因为它的 setCompletionPrefix
方法似乎触发了模型内的完成搜索,但它不是虚拟的,因此您不能覆盖它以多态工作。您可能需要自定义您尝试使用完成器的小部件,以便它使用具有高效搜索和数据结构的自定义完成逻辑,并且仅使用 QCompleter
来保存一个小的(已排序的)候选列表.有一个 example 做了一些类似的事情,所以它可能值得一试。
我已经用 QStringList 初始化了 QCompleter。而这个字符串列表有超过 30,000 个条目。我已经在 ui 中连接到 Qlineedit。那里没有问题。问题在于,每当我在该 qlineedit 中键入内容时,正如您可能猜到的那样,弹出的建议非常缓慢,因为有超过 30,000 个条目。所以我想知道是否有其他方法可以提高性能?比如通过使用多线程或类似的东西。我是qt的新手,如果我在实施过程中犯了任何错误,我深表歉意。谢谢
编辑:
我的问题与这个问题
您可以尝试的第一件事是使用已排序的 QStringList
而不是未排序的。我不知道你从哪里获取列表的字符串,但如果你可以按排序顺序而不是未排序的顺序获取它们,你一定要尝试一下。然后你就可以调用 setModelSorting method on the completer with QCompleter::CaseSensitivelySortedModel
or QCompleter::CaseInsensitivelySortedModel
value - that would allow your completer to switch from linear search (O(n) complexity) to binary search (O(log(n))复杂性)。给定字符串列表的大小,最坏情况下的二分搜索需要 11 次比较 (log(30000) ~= 10.3) 才能找到特定字符串,而线性搜索在最坏情况下需要 30000 次比较。
此建议可能对您不起作用,因为您无法在字符串列表中按排序顺序获取数据(或进入由任何自定义 QAbstractItemModel
子类表示的任何其他数据结构) .不幸的是,QCompleter
似乎不容易扩展,因为它的 setCompletionPrefix
方法似乎触发了模型内的完成搜索,但它不是虚拟的,因此您不能覆盖它以多态工作。您可能需要自定义您尝试使用完成器的小部件,以便它使用具有高效搜索和数据结构的自定义完成逻辑,并且仅使用 QCompleter
来保存一个小的(已排序的)候选列表.有一个 example 做了一些类似的事情,所以它可能值得一试。