Как использовать пользовательскую функцию проверки для QCompleter в QComboBox

У меня есть функция сопоставления строк, которая будет использоваться для поиска имен, которые являются более продвинутыми, чем QString::contains() (например, когда вы ищете «mueller», он будет совпадать с «Müller»).

Я хотел бы использовать эту функцию для поиска внутри QComboBox, Завершение по умолчанию почти делает то, что мне нужно: если я делаю

combobox->setEditable(true);
combobox->setInsertPolicy(QComboBox::NoInsert);
combobox->completer()->setCompletionMode(QCompleter::PopupCompletion);

и введите текст в QComboBoxlineedit, всплывающее окно, показывающее только записи, начиная с того, что было набрано.

Это то, что я хочу, но я бы хотел QCompleter оценивать совпадения, используя мою функцию поиска, а не QString::startsWith() что, по-видимому, используется здесь (и установка режима в Qt::MatchContains лучше, но все еще не достаточно).

Есть ли способ настроить функцию поиска полнотелого?

Спасибо за помощь!

0

Решение

Я в конечном итоге использовал собственный 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() обработать то, что было выбрано из списка и e. г. сделать QComboBox::setCurrentIndex() или такой.

0

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

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

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