0

我有一个字符串匹配函数用于搜索比它更高级的名称QString::contains()(例如,当您搜索“mueller”时,它将匹配“Müller”)。

我想使用此功能在QComboBox. 默认完成几乎可以满足我的需要:如果我这样做

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

并在 's lineedit 中键入一些文本,QComboBox弹出窗口,仅显示已键入内容的条目。

这就是我想要的,但我希望QCompleter使用我的搜索功能来评估匹配,而不是QString::startsWith()这里显然使用的(并且将模式设置Qt::MatchContains为更好但仍然不够)。

有没有办法自定义完成者的搜索功能?

感谢大家的帮助!

4

1 回答 1

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()处理从列表中选择的内容,例如做一个QComboBox::setCurrentIndex()或这样的事情。

于 2018-08-12T09:51:01.563 回答