Как использовать пользовательскую функцию проверки для QCompleter в QComboBox
У меня есть функция сопоставления строк, которая будет использоваться для поиска имен, которые являются более продвинутыми, чем QString::contains()
(например, когда вы ищете "mueller", он будет соответствовать "Müller").
Я хотел бы использовать эту функцию для поиска внутри QComboBox
, Завершение по умолчанию почти делает то, что мне нужно: если я делаю
combobox->setEditable(true);
combobox->setInsertPolicy(QComboBox::NoInsert);
combobox->completer()->setCompletionMode(QCompleter::PopupCompletion);
и введите текст в QComboBox
lineedit, всплывающее окно, показывающее только записи, начиная с того, что было набрано.
Это то, что я хочу, но я бы хотел QCompleter
оценивать совпадения, используя мою функцию поиска, а не QString::startsWith()
что, по-видимому, используется здесь (и установка режима в Qt::MatchContains
лучше, но все еще не достаточно).
Есть ли способ настроить функцию поиска полнотелого?
Спасибо за помощь!
1 ответ
Я в конечном итоге использовал собственный QCompleter
и установить его для QComboBox
"s QLineEdit
, Завершитель использует не модель комбинированного списка, а собственную модель, которая заполняется данными при каждом изменении введенного текста.
Можно сделать следующим образом:
m_matchingNames = new QStringListModel(this);
m_nameCompleter = new QCompleter(m_matchingNames, this);
m_nameCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
m_playersSelect->setEditable(true);
m_playersSelect->setInsertPolicy(QComboBox::NoInsert);
m_playersSelect->setCompleter(0);
m_playersSelect->lineEdit()->setCompleter(m_nameCompleter);
connect(m_playersSelect->lineEdit(), &QLineEdit::textEdited, this, &ScorePage::nameSearchChanged);
а также
void ScorePage::nameSearchChanged(const QString &text)
{
QStringList possibleNames;
for (const QString &name : m_availableNames) {
if (checkMatch(name, text)) {
possibleNames << name;
}
}
m_matchingNames->setStringList(possibleNames);
}
Скорее всего, не самое предформаторное решение, но оно работает:-)
Затем можно также подключиться к QCompleter::activated()
обработать то, что было выбрано из списка и, например, сделать QComboBox::setCurrentIndex()
или такой.