Как использовать пользовательскую функцию проверки для 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 лучше, но все еще не достаточно).

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

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

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() или такой.

Другие вопросы по тегам