我有一个字符串匹配功能,可用于搜索比QString::contains()
更高级的名称(例如,当您搜索“ mueller”时,它将匹配“Müller”)。
我想使用此功能在QComboBox
中进行搜索。默认补全几乎可以满足我的需要:
combobox->setEditable(true);
combobox->setInsertPolicy(QComboBox::NoInsert);
combobox->completer()->setCompletionMode(QCompleter::PopupCompletion);
,然后在QComboBox
的行编辑中键入一些文本,弹出窗口弹出,仅显示从键入内容开始的条目。
这就是我想要的,但是我希望QCompleter
使用搜索功能而不是这里显然使用的QString::startsWith()
来评估匹配项(并将模式设置为Qt::MatchContains
更好,但仍然不够)。
有什么方法可以自定义完成者的搜索功能?
感谢所有帮助!
答案 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()
之类的。