У меня есть функция сопоставления строк, которая будет использоваться для поиска имен, которые являются более продвинутыми, чем 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
лучше, но все еще не достаточно).
Есть ли способ настроить функцию поиска полнотелого?
Спасибо за помощь!
Я в конечном итоге использовал собственный 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()
или такой.
Других решений пока нет …