C++ 如何在QComboBox中为QCompleter使用自定义验证函数
我有一个字符串匹配函数,用于搜索比C++ 如何在QComboBox中为QCompleter使用自定义验证函数,c++,qt,qt5,qcombobox,qcompleter,C++,Qt,Qt5,Qcombobox,Qcompleter,我有一个字符串匹配函数,用于搜索比QString::contains()更高级的名称(例如,当您搜索“mueller”时,它将匹配“Müller”) 我想使用此功能在QComboBox中搜索。默认完成几乎满足了我的需要:如果我这样做了 combobox->setEditable(true); combobox->setInsertPolicy(QComboBox::NoInsert); combobox->completer()->setCompletionMode(QC
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
的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(常量QString&text)
{
QStringList可能名称;
用于(常量字符串和名称:m_availableNames){
如果(选中匹配(名称、文本)){
可能名称集合字符串(可能名称);
}
很可能不是最理想的解决方案,但它可以工作:-)
然后还可以连接到
QCompleter::activated()
以处理从列表中选择的内容,例如执行QComboBox::setCurrentIndex()
或诸如此类。创建一个自定义模型,并使用免责声明实现搜索:未测试。您不能将QComboBox::setCompleter
与此示例中的自定义完成符()?看起来您可以使用搜索功能,用所有建议填充QStringList
,然后为QComboBox
设置它。据我所知,如果QComboBox中的项目为:{“alpha”、“omega”、“omicron”、“zeta”},并且在QComboBox中输入“m”,您应该显示“omega”和“omicron”,对吗?是的,但这可以通过默认的实现/行为实现。我的匹配函数还处理变音符号、德语Umlauts等,并且还匹配例如“John Doe”和searchb术语“Doe John”。因此,我不能使用默认的匹配方法,但需要使用我的自定义函数。@Azeem:可能的建议不是问题,因为所有可能的值都已添加到QComboBox
。问题是如何选择与输入字符串匹配的可能值,作为的QCompleter
的匹配函数FER是不够的(实际上,我检查了搜索词和可能的补全词的多个不同版本)。
void ScorePage::nameSearchChanged(const QString &text)
{
QStringList possibleNames;
for (const QString &name : m_availableNames) {
if (checkMatch(name, text)) {
possibleNames << name;
}
}
m_matchingNames->setStringList(possibleNames);
}