如何在 QComboBox 中为 QCompleter 使用自定义验证函数

How to use a custom validation function for a QCompleter in a 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 更好,但仍然不够)。

有什么办法可以自定义完成者的搜索功能吗?

感谢大家的帮助!

我最终使用了自己的 QCompleter 并将其设置为 QComboBoxQLineEdit。完成器不使用组合框的模型,而是使用自己的模型,每次输入的文本更改时都会填充数据。

可按如下方式进行:

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 中选择的内容。 G。做一个 QComboBox::setCurrentIndex() 之类的。