Как оптимизировать производительность QCompleter?

Я инициализировал QCompleter с QStringList. И этот список строк содержит более 30000 записей. Я подключился к Qlineedit в моем интерфейсе. Там нет проблем. Проблема заключается в том, что всякий раз, когда я что-то набираю в этом qlineedit, как вы можете догадаться, это предложение появляется очень медленно, поскольку в нем более 30 000 записей. Так что мне было интересно, есть ли другой способ улучшить производительность? например, используя многопоточность или что-то подобное. Я новичок в Qt, я прошу прощения, если я сделал какую-либо ошибку в реализации. Спасибо

Редактировать:
Моя проблема отличается от этого вопроса QCompleter для больших моделей так как я не использую QComboBox, я использую QLineEdit.

1

Решение

Первое, что вы можете попробовать, это использовать отсортированный QStringList вместо несортированного. Я не знаю, где вы берете строки для своего списка, но если вы можете получить их в отсортированном порядке, а не в несортированном, вам обязательно стоит попробовать. Тогда вы сможете позвонить setModelSorting метод на завершение с QCompleter::CaseSensitivelySortedModel или же QCompleter::CaseInsensitivelySortedModel значение — это позволит вашему завершителю переключиться с линейный поиск (O (n) сложность) до бинарный поиск (O (log (n)) сложность). Учитывая ваш размер списка строк, бинарный поиск в худшем случае потребует 11 сравнений (log (30000) ~ = 10,3), чтобы найти конкретную строку, в то время как линейный поиск потребует 30000 сравнений в худшем случае.

Возможно, это предложение не сработает, потому что вы не можете получить данные в отсортированном порядке в списке строк (или в любой другой структуре данных, представленной любым пользовательским QAbstractItemModel подкласс). К сожалению, это не похоже на QCompleter легко расширяемый, так как его setCompletionPrefix метод, который запускает поиск завершений в модели, не является виртуальным, поэтому вы не можете переопределить его для полиморфной работы. Возможно, вам придется настроить виджет, для которого вы пытаетесь использовать завершитель, чтобы он использовал настраиваемую логику завершения с эффективным поиском и структурами данных и использовал только QCompleter хранить небольшой (и отсортированный) список уже найденных кандидатов. Там есть пример что делает что-то похожее, так что, возможно, стоит проверить.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]