Я инициализировал QCompleter с QStringList. И этот список строк содержит более 30000 записей. Я подключился к Qlineedit в моем интерфейсе. Там нет проблем. Проблема заключается в том, что всякий раз, когда я что-то набираю в этом qlineedit, как вы можете догадаться, это предложение появляется очень медленно, поскольку в нем более 30 000 записей. Так что мне было интересно, есть ли другой способ улучшить производительность? например, используя многопоточность или что-то подобное. Я новичок в Qt, я прошу прощения, если я сделал какую-либо ошибку в реализации. Спасибо
Редактировать:
Моя проблема отличается от этого вопроса QCompleter для больших моделей так как я не использую QComboBox, я использую QLineEdit.
Первое, что вы можете попробовать, это использовать отсортированный QStringList
вместо несортированного. Я не знаю, где вы берете строки для своего списка, но если вы можете получить их в отсортированном порядке, а не в несортированном, вам обязательно стоит попробовать. Тогда вы сможете позвонить setModelSorting метод на завершение с QCompleter::CaseSensitivelySortedModel
или же QCompleter::CaseInsensitivelySortedModel
значение — это позволит вашему завершителю переключиться с линейный поиск (O (n) сложность) до бинарный поиск (O (log (n)) сложность). Учитывая ваш размер списка строк, бинарный поиск в худшем случае потребует 11 сравнений (log (30000) ~ = 10,3), чтобы найти конкретную строку, в то время как линейный поиск потребует 30000 сравнений в худшем случае.
Возможно, это предложение не сработает, потому что вы не можете получить данные в отсортированном порядке в списке строк (или в любой другой структуре данных, представленной любым пользовательским QAbstractItemModel
подкласс). К сожалению, это не похоже на QCompleter
легко расширяемый, так как его setCompletionPrefix
метод, который запускает поиск завершений в модели, не является виртуальным, поэтому вы не можете переопределить его для полиморфной работы. Возможно, вам придется настроить виджет, для которого вы пытаетесь использовать завершитель, чтобы он использовал настраиваемую логику завершения с эффективным поиском и структурами данных и использовал только QCompleter
хранить небольшой (и отсортированный) список уже найденных кандидатов. Там есть пример что делает что-то похожее, так что, возможно, стоит проверить.
Других решений пока нет …