如何在QComboBox中为QCompleter使用自定义验证功能

时间:2018-08-09 11:52:10

标签: c++ qt qt5 qcombobox qcompleter

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

我想使用此功能在QComboBox中进行搜索。默认补全几乎可以满足我的需要:

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

,然后在QComboBox的行编辑中键入一些文本,弹出窗口弹出,仅显示从键入内容开始的条目。

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

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

感谢所有帮助!

1 个答案:

答案 0 :(得分:0)

我最终使用了自己的QCompleter,并将其设置为QComboBox的{​​{1}}。该完成程序不使用组合框模型,而是使用自己的模型,每次输入的文本更改时,该模型就会填充数据。

可以执行以下操作:

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); } 来处理从列表和e中选择的内容。 G。做QCompleter::activated()之类的。