Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QComboBox中为QCompleter使用自定义验证函数_C++_Qt_Qt5_Qcombobox_Qcompleter - Fatal编程技术网

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);
}